如何在Wagtail CMS上向其他模型的模板添加查询外部模型的上下文

问题描述 投票:0回答:1

我有通常由w设置的通常的home.HomePage()模型,这是它包含的内容:

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()方法。实际上,此方法进行循环以从(管理员)收集与ForeignKey具有ImageCarousel关系的产品。这是方法:

    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()中找到它。

这里是问题。上下文不适用于前端。我已经用carousel_products()测试了python manage.py shell函数的性能,并且可以完成工作。这里的问题是它没有显示在由模板驱动的网页上:'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文档。谢谢!

html wagtail
1个回答
0
投票

代码问题在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())查询每个产品,并检查每个产品是否都是轮播商品。返回的是TrueFalse

在原始代码中,附加在carousel_items_list上的是该支票的返回值(即TrueFalse),而不是产品或产品名称。

我的解决方案修复了有关功能性能的判断错误。现在,该函数返回正确的数据,并且模板加载所需的数据。

© www.soinside.com 2019 - 2024. All rights reserved.