【问题标题】:Retrieve data from database for different wagtail app从数据库中检索不同 wagtail 应用程序的数据
【发布时间】:2021-06-04 16:23:13
【问题描述】:

我正在尝试创建一个 Streamfield 块,该块基本上显示标准诊断列表页面中的所有帖子(诊断),这样我不仅有一个单独的诊断页面,而且还能够添加一个诊断/帖子块到其他页面?

到目前为止,我已经得到了这个,但它不起作用:

流> blocks.py:

class DiagnosesListingBlock(blocks.StructBlock):

    title = blocks.CharBlock(
        required= True,
        defualt="Diagnoses",
        help_text = 'Text to display as title of Diagnoses section.'
    )

    data_items = blocks.IntegerBlock(
        max_length=2,
        blank=False,
        null=False,
        default="3",
    )
    
    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        context['diagnoses'] = diagnoses.DiagnosisPage.objects.live().public()
        return context

    class Meta:
        template = "streams/disgnoses_listing_block.html"
        icon = "edit"
        label = "Diagnoses Listing Block"
        help_text = "Centered text to display on a page"

诊断 > model.py:

class DiagnosisPage(Page):

    template = "diagnoses/diagnosis_page.html"

    diagnosis_name = models.TextField(
        blank=True,
        max_length=100,

    )

    subtitle = models.TextField(
        blank=True,
        max_length=500,

    )    
    
    diagnosis_intro = models.TextField(
        blank=True,
        max_length=500
    )

    image = models.ForeignKey(
        'wagtailimages.Image',
        blank=False,
        null=True,
        on_delete=models.SET_NULL,
        help_text='This image will be used on the service listing page and will be cropped to 570px by 370px.',
        related_name='+',
    )

    summary =  models.CharField(
        max_length=160,
        blank=False,
        null=False,
        default='Curabitur pulvinar euismod ante, ac sagittis ante posuere ac. Vivamus luctus commodo dolor porta feugiat. Fusce at velit id ligula pharetra laoreet.',
        help_text='Provides an excert for the blog listing page that gives an intro to what the article is about.',
    )

    

    body = StreamField([
        ("hero_block", blocks.HeroBlock()),
        ("breadcrumb_block", blocks.BreadcrumbsBlock()),
        ("highlighted_text_block", blocks.HighlightedTextBlock()),
        ("title", blocks.TitleAndTextBlock()),
        ("about_us", blocks.AboutBlock()),
        ("cards", blocks.CardsBlock()),
        ("icon_boxes_one", blocks.TextBoxesOneBlock()),
        ("links", blocks.SiteLinksBlock()),
        ("image_and_text", blocks.ImageAndTextBlock()),
        ("image_right_and_text", blocks.ImageRightAndTextBlock()),
        ("team_members", blocks.TeamMembersBlock()),
        ("cta_1", blocks.CallToActionOneBlock()),
        ("cta_2", blocks.CallToActionTwoBlock()),
        ("cta_3", blocks.CallToActionThreeBlock()),
        ("large_modal_block", blocks.LargeModalBlock()),
        ("counters_block", blocks.CountersBlock()),
        ("share_this_post", blocks.ShareThisPostBlock()),
        ("blockquotes", blocks.BlockquoteBlock()),
        ("accordions", blocks.AccordionBlock()),
        ("testimonial", SnippetChooserBlock(
            target_model='testimonials.Testimonial')),
        ("our_numbers", blocks.OurNumbersBlock()),
        ("progress_bars", blocks.ProgresssBarsBlock()),
        ("testimonial", SnippetChooserBlock(
            target_model='testimonials.Testimonial',
            template='streams/testimonial_block.html'
        )),
        ("pricing_table", blocks.PricingTableBlock(
            table_options=new_table_options)),
        ("logo_block", blocks.LogoBlock()),
        ("timeline_block", blocks.TimelineBlock()),
        ("richtext", blocks.RichTextWithTitleBlock()),
    ], blank=True, null=True)

    content_panels = Page.content_panels + [
        FieldPanel('diagnosis_name'),
        FieldPanel('subtitle'),
        FieldPanel('diagnosis_intro'),
        ImageChooserPanel('image'),
        StreamFieldPanel("body"),
    ]

diagnosis_listing_block.html:

{% load wagtailcore_tags wagtailimages_tags %}


<section class="p-t-100 p-b-100">
    <div class="container">
        <div class="row" style="display: table;width: 100%;">
            <div class="col-lg-12">{{ self }}
                <!--Post Carousel -->
                <h4 class="mb-4">{{ self.title }}</h4>
                <div class="carousel" data-items="{{ self.data_items }}">
                    {% for diagnosis in self.diagnoses %}
                    <!-- Post item-->
                    <div class="post-item border" style="display: table-cell;">
                        <div class="post-item-wrap">
                            <div class="post-image">
                                <a href="{{ diagnosis.url }}">
                                    {% image diagnosis.image fill-250x150 format-webp as diagnosis_img %}
                                    <img alt="{{ diagnosis.diagnosis_name }} | Dual Diagnosis Network Blog" src="{{ diagnosis_img.url }}"></a>
                                <!--<span class="post-meta-category"><a href=""></a></span>-->
                            </div>
                            <div class="post-item-description">
                                <span class="post-meta-date"><i class="fa fa-calendar-o"></i>Jan 21, 2017</span>
                                <span class="post-meta-comments"><a href="{{ diagnosis.url }}"><i class="fa fa-comments-o"></i>33
                                        Comments</a></span>
                                <h2><a href="{{ diagnosis.link.url }}">{{ diagnosis.diagnosis_name }}</a></h2>
                                <p>{{ diagnosis.summary }}</p>
                                <a href="{{ diagnosis.link.url }}" class="item-link">Read More <i class="icon-chevron-right"></i></a>
                            </div>
                        </div>
                    </div>
                    {% endfor %}
                    <!-- end: Post item-->
                </div>
                <!--end: Post Carousel -->
            </div>
        </div>
    </div>
</section>

【问题讨论】:

  • 这里没有足够的代码来说明这里可能出了什么问题。这是块对象、页面或其他东西的get_context 方法的一部分吗?请包括完整的类定义和模板代码,并描述究竟是什么“不工作”。

标签: wagtail wagtail-streamfield


【解决方案1】:

{% for diagnosis in self.diagnoses %} 应该是{% for diagnosis in diagnoses %}

get_context 方法定义了模板中可用的新变量 - 在本例中,context['diagnoses'] = ... 行定义了一个变量 diagnoses,这就是您在模板中引用它的方式。 self.diagnoses 将表示块值的属性,但这不存在 - 它只有属性 titledata_items

【讨论】:

  • 那么,基本上,我应该使用 get_context_data(self, request) 以便能够从数据库中获取数据吗?
  • get_context 而不是 get_context_data,但是是的 - 该方法是在块模板中进行数据库查找的好地方。
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多