如何在 Wagtail CMS 上将查询外部模型的上下文添加到另一个模型的模板
How to add context querying an external model to another model's template on Wagtail CMS
我有通常的 home.HomePage() 默认情况下由 wagtail 设置的模型,这是它包含的内容:
class HomePage(Page):
advertised_lowest_price = models.FloatField(blank=True, null=True, max_length=20,)
season_year = models.PositiveIntegerField(blank=True, null=True)
season_statement = RichTextField(blank=True, null=True, help_text="THIS MUST BE IN 'h2' TAG! To avoid frontend"
" display irregularities, you must use the"
" H2 tag",
features=['bold', 'italic', 'hr', 'link', 'document-link', 'embed', 'underline',
'strike-through', 'h2', 'h3'],
)
premium_topic = models.CharField(null=True, blank=True, help_text='Premium Products text', max_length=80)
premium_sub_topic = models.CharField(null=True, blank=True, help_text='Premium Products Sub-topic text',
max_length=80)
article_section_topic = models.CharField(null=True, blank=True, max_length=80)
def get_context(self, request):
context = super().get_context(request)
context['home_page'] = HomePage.objects.live().all()
def carousel_products():
carousel_items_list = []
for carousel_item in AdministratorProducts.objects.all():
carousel_items_list.append(carousel_item.is_carousel())
return carousel_items_list
context['carousel_1'] = carousel_products()[0]
return context
content_panels = Page.content_panels + [
FieldPanel('advertised_lowest_price'),
FieldPanel('season_year'),
FieldPanel('season_statement'),
FieldPanel('premium_topic'),
FieldPanel('premium_sub_topic'),
FieldPanel('article_section_topic'),
]
template = 'home/index.html'
def __str__(self):
return self.season_statement
也就是说,我还有一个轮播模式,可以作为索引页轮播上其他产品的外壳 > index.html
。
这是旋转木马的模型:
class ImageCarousel(Page):
carousel_name = models.CharField(max_length=100, default='ART!')
date_time_stamp = models.DateTimeField(blank=True, null=True, help_text='Date product was added to Carousel.')
class Meta:
verbose_name_plural = 'Images on the Carousel'
def __str__(self):
return self.title
content_panels = Page.content_panels + [
FieldPanel('carousel_name'),
]
template = 'home/index.html'
您可能已经注意到,ImageCarousel
也写入与 HomePage
相同的模板,即 index.html
。
与此同时,我从另一个应用程序中获得了另一个模型,该模型具有 ImageCarousel
作为 ForeignKey
。这是位于 'ixorabloom_administrator_products/models.py'
:
的模型
class AdministratorProducts(Page):
administrator_product_name = models.CharField(max_length=100)
administrator_product_bio = models.TextField(blank=True, null=True)
administrator_product_primary_genre = models.CharField(max_length=4, choices=ART_GENRES, null=True, blank=True)
administrator_product_secondary_genre = models.TextField(help_text='Comma (,) separated list of secondary art '
'genres',
null=True,
blank=True)
administrator_product_carousel = models.ForeignKey("home.ImageCarousel",
null=True,
blank=True,
on_delete=models.SET_NULL)
administrator_product_carousel_year = models.PositiveIntegerField(help_text="Year to be displayed if this product"
" is on the carousel",
null=True,
blank=True)
administrator_product_date_of_creation = models.DateField(null=True, blank=True, help_text='Date product was made')
administrator_product_website_link = models.URLField(blank=True, null=True, help_text='External website where this'
'product can be found or'
'bought.')
administrator_product_email_address = models.EmailField(blank=True, null=True, help_text='External Mailing site'
'where this product can be'
'ordered.')
administrator_product_picture = models.ForeignKey("wagtailimages.Image",
null=True,
blank=True,
on_delete=models.SET_NULL)
administrator_product_price = models.FloatField(null=True, blank=True)
content_panels = Page.content_panels + [
FieldPanel('administrator_product_name'),
FieldPanel('administrator_product_bio'),
FieldPanel('administrator_product_primary_genre'),
FieldPanel('administrator_product_secondary_genre'),
FieldPanel('administrator_product_carousel'),
FieldPanel('administrator_product_carousel_year'),
FieldPanel('administrator_product_website_link'),
FieldPanel('administrator_product_email_address'),
ImageChooserPanel('administrator_product_picture'),
FieldPanel('administrator_product_price'),
FieldPanel('administrator_product_date_of_creation'),
]
class Meta:
verbose_name_plural = 'Administrator Art Products'
def __str__(self):
return self.administrator_product_name
def is_carousel(self):
if self.administrator_product_carousel:
return True
else:
return False
回头看HomePage
,那里有个get_context()
方法。这个方法实际上做了一个循环来收集(来自管理员的)与 ImageCarousel
有 ForeignKey
关系的产品。方法如下:
def get_context(self, request):
context = super().get_context(request)
context['home_page'] = HomePage.objects.live().all()
def carousel_products():
carousel_items_list = []
for carousel_item in AdministratorProducts.objects.all():
carousel_items_list.append(carousel_item.is_carousel())
return carousel_items_list
context['carousel_1'] = carousel_products()[0]
return context
**您也可以在 ** HomePage().get_context()
中找到它。
问题来了。上下文在前端不起作用。我用 python manage.py shell
测试了 carousel_products()
函数的性能,它完成了工作。这里的问题是它没有显示在由模板支持的网页上:'home/index.html'
。
这是 'home/index.html'
的部分,它使用了新添加的上下文:
{% if carousel_1 %}
<div class="hs-item">
<div class="hs-left"><img src="{{ carousel_1.administrator_product_picture.url }}" alt=""></div>
<div class="hs-right">
<div class="hs-content">
<div class="price">from ₦{{ carousel_1.administrator_product_price }}</div>
<h2 style="margin-bottom: 0px;">
<span>{{ carousel_1.administrator_product_carousel_year }}</span>
<br>
</h2>
<a href="" class="site-btn">Shop NOW!</a>
</div>
</div>
</div>
{% endif %}
我做错了什么?我也可以解决这个问题吗?任何我没有添加到问题中的内容,请告诉我,我将提供所需的数据。
我在 Wagtail CMS 上也遇到了非常困难的情况。我真的希望有人能清楚地解释他们的模板设计和使用系统。我的实现全部来自 Wagtail 文档。谢谢!
代码的问题在 HomePage()
模型中。准确地说,get_context().carousel_products()
。这是对 carousel_products()
.
的更正
def carousel_products():
carousel_items_list = []
for carousel_item in AdministratorProducts.objects.all():
if carousel_item.is_carousel():
carousel_items_list.append(carousel_item)
return carousel_items_list
原始代码的问题在于 for 循环正在查询 AdministratorProducts
(即 AdministratorProducts.objects.all()
)中的每个产品,并检查每个产品是否为轮播项目。返回的是 True
或 False
.
在原始代码中,附加到 carousel_items_list
的是该检查的返回值(即 True
或 False
),而不是产品或产品名称.
我的解决方案修复了函数性能判断错误。现在函数 returns 正确的数据和模板加载所需的数据。
我有通常的 home.HomePage() 默认情况下由 wagtail 设置的模型,这是它包含的内容:
class HomePage(Page):
advertised_lowest_price = models.FloatField(blank=True, null=True, max_length=20,)
season_year = models.PositiveIntegerField(blank=True, null=True)
season_statement = RichTextField(blank=True, null=True, help_text="THIS MUST BE IN 'h2' TAG! To avoid frontend"
" display irregularities, you must use the"
" H2 tag",
features=['bold', 'italic', 'hr', 'link', 'document-link', 'embed', 'underline',
'strike-through', 'h2', 'h3'],
)
premium_topic = models.CharField(null=True, blank=True, help_text='Premium Products text', max_length=80)
premium_sub_topic = models.CharField(null=True, blank=True, help_text='Premium Products Sub-topic text',
max_length=80)
article_section_topic = models.CharField(null=True, blank=True, max_length=80)
def get_context(self, request):
context = super().get_context(request)
context['home_page'] = HomePage.objects.live().all()
def carousel_products():
carousel_items_list = []
for carousel_item in AdministratorProducts.objects.all():
carousel_items_list.append(carousel_item.is_carousel())
return carousel_items_list
context['carousel_1'] = carousel_products()[0]
return context
content_panels = Page.content_panels + [
FieldPanel('advertised_lowest_price'),
FieldPanel('season_year'),
FieldPanel('season_statement'),
FieldPanel('premium_topic'),
FieldPanel('premium_sub_topic'),
FieldPanel('article_section_topic'),
]
template = 'home/index.html'
def __str__(self):
return self.season_statement
也就是说,我还有一个轮播模式,可以作为索引页轮播上其他产品的外壳 > index.html
。
这是旋转木马的模型:
class ImageCarousel(Page):
carousel_name = models.CharField(max_length=100, default='ART!')
date_time_stamp = models.DateTimeField(blank=True, null=True, help_text='Date product was added to Carousel.')
class Meta:
verbose_name_plural = 'Images on the Carousel'
def __str__(self):
return self.title
content_panels = Page.content_panels + [
FieldPanel('carousel_name'),
]
template = 'home/index.html'
您可能已经注意到,ImageCarousel
也写入与 HomePage
相同的模板,即 index.html
。
与此同时,我从另一个应用程序中获得了另一个模型,该模型具有 ImageCarousel
作为 ForeignKey
。这是位于 'ixorabloom_administrator_products/models.py'
:
class AdministratorProducts(Page):
administrator_product_name = models.CharField(max_length=100)
administrator_product_bio = models.TextField(blank=True, null=True)
administrator_product_primary_genre = models.CharField(max_length=4, choices=ART_GENRES, null=True, blank=True)
administrator_product_secondary_genre = models.TextField(help_text='Comma (,) separated list of secondary art '
'genres',
null=True,
blank=True)
administrator_product_carousel = models.ForeignKey("home.ImageCarousel",
null=True,
blank=True,
on_delete=models.SET_NULL)
administrator_product_carousel_year = models.PositiveIntegerField(help_text="Year to be displayed if this product"
" is on the carousel",
null=True,
blank=True)
administrator_product_date_of_creation = models.DateField(null=True, blank=True, help_text='Date product was made')
administrator_product_website_link = models.URLField(blank=True, null=True, help_text='External website where this'
'product can be found or'
'bought.')
administrator_product_email_address = models.EmailField(blank=True, null=True, help_text='External Mailing site'
'where this product can be'
'ordered.')
administrator_product_picture = models.ForeignKey("wagtailimages.Image",
null=True,
blank=True,
on_delete=models.SET_NULL)
administrator_product_price = models.FloatField(null=True, blank=True)
content_panels = Page.content_panels + [
FieldPanel('administrator_product_name'),
FieldPanel('administrator_product_bio'),
FieldPanel('administrator_product_primary_genre'),
FieldPanel('administrator_product_secondary_genre'),
FieldPanel('administrator_product_carousel'),
FieldPanel('administrator_product_carousel_year'),
FieldPanel('administrator_product_website_link'),
FieldPanel('administrator_product_email_address'),
ImageChooserPanel('administrator_product_picture'),
FieldPanel('administrator_product_price'),
FieldPanel('administrator_product_date_of_creation'),
]
class Meta:
verbose_name_plural = 'Administrator Art Products'
def __str__(self):
return self.administrator_product_name
def is_carousel(self):
if self.administrator_product_carousel:
return True
else:
return False
回头看HomePage
,那里有个get_context()
方法。这个方法实际上做了一个循环来收集(来自管理员的)与 ImageCarousel
有 ForeignKey
关系的产品。方法如下:
def get_context(self, request):
context = super().get_context(request)
context['home_page'] = HomePage.objects.live().all()
def carousel_products():
carousel_items_list = []
for carousel_item in AdministratorProducts.objects.all():
carousel_items_list.append(carousel_item.is_carousel())
return carousel_items_list
context['carousel_1'] = carousel_products()[0]
return context
**您也可以在 ** HomePage().get_context()
中找到它。
问题来了。上下文在前端不起作用。我用 python manage.py shell
测试了 carousel_products()
函数的性能,它完成了工作。这里的问题是它没有显示在由模板支持的网页上:'home/index.html'
。
这是 'home/index.html'
的部分,它使用了新添加的上下文:
{% if carousel_1 %}
<div class="hs-item">
<div class="hs-left"><img src="{{ carousel_1.administrator_product_picture.url }}" alt=""></div>
<div class="hs-right">
<div class="hs-content">
<div class="price">from ₦{{ carousel_1.administrator_product_price }}</div>
<h2 style="margin-bottom: 0px;">
<span>{{ carousel_1.administrator_product_carousel_year }}</span>
<br>
</h2>
<a href="" class="site-btn">Shop NOW!</a>
</div>
</div>
</div>
{% endif %}
我做错了什么?我也可以解决这个问题吗?任何我没有添加到问题中的内容,请告诉我,我将提供所需的数据。 我在 Wagtail CMS 上也遇到了非常困难的情况。我真的希望有人能清楚地解释他们的模板设计和使用系统。我的实现全部来自 Wagtail 文档。谢谢!
代码的问题在 HomePage()
模型中。准确地说,get_context().carousel_products()
。这是对 carousel_products()
.
def carousel_products():
carousel_items_list = []
for carousel_item in AdministratorProducts.objects.all():
if carousel_item.is_carousel():
carousel_items_list.append(carousel_item)
return carousel_items_list
原始代码的问题在于 for 循环正在查询 AdministratorProducts
(即 AdministratorProducts.objects.all()
)中的每个产品,并检查每个产品是否为轮播项目。返回的是 True
或 False
.
在原始代码中,附加到 carousel_items_list
的是该检查的返回值(即 True
或 False
),而不是产品或产品名称.
我的解决方案修复了函数性能判断错误。现在函数 returns 正确的数据和模板加载所需的数据。