gpt4 book ai didi

python - 获取 Wagtail 中受密码保护版本的另一个页面的数据

转载 作者:太空宇宙 更新时间:2023-11-03 21:04:07 25 4
gpt4 key购买 nike

我是 Python 和 Wagtail 新手。我已经掌握了我正在开发的 Wagtail 网站的大部分内容,但仍遇到一个问题。

该网站将展示一组用于零售(已完成和正在使用)的产品(植物)以及用于贸易的同一组产品(仅显示贸易价格)。我有PlantIndexPagePlantPage Wagtail 模型,后者具有多个产品领域和两个价格领域。

交易价格信息应受密码保护 Wagtail's 'page privacy'密码选项,所以我相信我需要一个单独的索引页面( TradePlantIndexPage ),我可以在 Wagtail 管理中应用此页面隐私设置,以有效地包含其自己的公共(public)贸易版本 PlantPage产品页面。

所以我有很多PlantPage页(每种植物产品一页),以及一页 TradePlantPage页面使用 RoutablePageMixin @route接受任何 PlantPage 的 slug产品。

# working: /plants/
class PlantIndexPage(Page):
def get_context(self, request):
context = super().get_context(request)
context['plants'] = Page.objects.exact_type(PlantPage).live().all().order_by('title')
return context

# working, password protected: /trade/
class TradePlantIndexPage(PlantIndexPage):
template = 'plants/plant_index_page.html' # for PlantIndexPage and TradePlantIndexPage

def get_context(self, request):
context = super().get_context(request)
context['trade'] = True # condition in template depends on this to show trade prices
return context

# working: /plants/<plant_page_slug>
class PlantPage(Page):
price_retail = models.DecimalField(...)
price_trade = models.DecimalField(...)
# ...

# not yet working: /trade/plant/<plant_page_slug>
class TradePlantPage(RoutablePageMixin, PlantPage):
parent_page_types = ['TradePlantIndexPage']
subpage_types = []

template = 'plants/plant_page.html' # for PlantPage and TradePlantPage

def get_context(self, request):
context = super().get_context(request)
context['trade'] = True # condition in template depends on this to show trade price
context['plant'] = Page.objects.page(???).live() # how to get PlantPage by slug?
return context

@route(r'^([-\w]+)/$')
def trade(self, request, plant_slug):
self.trade = True
# how to render TradePlantPage with PlantPage content based on plant_slug?

我会得到 TradePlantIndexPage的植物列表链接到 TradePlantPage 的 URL可用 ( /trade/plant/<plant_page_slug> ) 而不是 PlantPage (/plants/<plant_page_slug>)。

用于显示特定植物 TradePlantPage ,如何获取 PlantPage 的正确实例基于trade @routeplant_slug ,并设置上下文,以便 PlantPage 的模板,使用page变量,有效吗?

我已在代码中附加了与此相关的评论/问题。谢谢。

<小时/>

更新

感谢gasman友善且易于理解的回答TradePlantPage的贸易路线现在正在工作。按照该答案的建议使用 plant而不是page ,我已经更新了PlantPage的上下文方法为:

    def get_context(self, request):
context = super().get_context(request)
context['trade'] = False
context['plant'] = context['page']
return context

这有效,但我想知道 context['plant'] = context['page'] 是否有效是使用 plant 的次优方式而不是page在共享模板中。例如,我想它会使用于字段数据的内存加倍?无论如何,对于这个小网站来说可能不是问题,除非我听到其他消息,否则我会使用它。

最佳答案

RoutablePageMixin 路由方法中,返回 HTTP 响应的过程与普通 Django View 函数中的工作方式相同 - 请参阅 Django's 'Views and templates' tutorial 。页面的 template 属性和 get_context 方法不会被使用,除非您显式地将它们连接起来(为了简单起见,我建议不要这样做,并设置模板和上下文变量直接在方法中代替)。

您的路线方法需要执行以下操作:

  • 根据 plant_slug 检索正确的 PlantPage - 我们将使用 Django 的 get_object_or_404 帮助程序
  • 渲染模板 plants/plant_page.html,向其传递上下文变量 trade(设置为 True)、plant(设置为检索到的 PlantPage)和 page(设置为当前页面,即 TradePlantPage 对象)。

这给了我们代码:

from django.shortcuts import get_object_or_404, render

class TradePlantPage(RoutablePageMixin, PlantPage):
parent_page_types = ['TradePlantIndexPage']
subpage_types = []

@route(r'^([-\w]+)/$')
def trade(self, request, plant_slug):
plant = get_object_or_404(PlantPage, slug=plant_slug)

return render(request, 'plants/plant_page.html', {
'trade': True,
'plant': plant,
'page': self,
})

注意:这里我假设您的 plant_page.html 模板设置为在从 PlantPage 调用时期望变量 plantTradePlantPage - 例如您使用 {{ plant.title }} 而不是 {{ page.title }} 来输出植物名称。如果情况并非如此,则可以将 PlantPage 对象作为 page 传递,方法是在上面的代码。不过,我建议最好让模板访问当前正在呈现的“真实”页面对象,这样您就可以在站点导航中突出显示正确的项目。

关于python - 获取 Wagtail 中受密码保护版本的另一个页面的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com