gpt4 book ai didi

python-2.7 - 访问模板文件 Wagtail 中的子页面模型属性

转载 作者:行者123 更新时间:2023-12-05 00:20:15 25 4
gpt4 key购买 nike

这是我的 model.py 文件

...

class LinkFields(models.Model):
link_external = models.URLField(
"External link",
blank=True,
null=True,
help_text='Set an external link if you want to describe the event from an other web site',
)
link_page = models.ForeignKey(
'wagtailcore.Page',
null=True,
on_delete=models.SET_NULL,
blank=True,
related_name='+',
help_text='Choose an existing page (event must have already been created)',
)

@property
def link(self):
if self.link_page:
return self.link_page.url
else:
return self.link_external

panels = [
FieldPanel('link_external'),
PageChooserPanel('link_page'),
]

class Meta:
abstract = True

class RelatedLink(LinkFields):
title = models.CharField(max_length=255, help_text="Link title")

panels = [
FieldPanel('title'),
MultiFieldPanel(LinkFields.panels, "Link"),
]

class Meta:
abstract = True


class HomePage(Page):
body = RichTextField(blank=True)

content_panels = Page.content_panels + [
FieldPanel('body', classname="full"),
InlinePanel('related_links', label="Related events"),
]


class EventsPage(Page):

# Database fields

date = models.DateField("Event date")
topicTag = models.CharField(max_length = 25)
name = models.CharField(max_length = 50)
city = models.CharField(max_length = 20, default="Where it is")
place = models.CharField(max_length = 20, blank=True)
body = RichTextField(blank=True)

# Search index configuration

search_fields = Page.search_fields + (
index.SearchField('topicTag'),
index.SearchField('place'),
index.FilterField('date'),
)

# Editor panels configuration

content_panels = Page.content_panels + [
FieldPanel('date'),
FieldPanel('topicTag'),
FieldPanel('name', classname="title"),
FieldPanel('city'),
FieldPanel('place'),
FieldPanel('body'),
]


class EventsRelatedLink(Orderable, RelatedLink):
page = ParentalKey('HomePage', related_name='related_links')

EventsPages 是 HomePage 的子页面,它本身显示后续子页面的链接。我的问题是对于我在主页上显示的每个子页面的链接,我想访问所谓的子页面的属性以显示一种预览。

这是我的 home_page.html 模板:
{% extends "base.html" %}

{% load wagtailcore_tags %}

{% block body_class %}template-homepage{% endblock %}

{% block content %}
<h1>THE <span class="pink">OPEN SOURCE</span> INNOVATION SPRING</h1>

<div class="intro">{{ page.body|richtext }}</div>

{% if page.related_links.all %}
<ul>
{% for item in page.related_links.all %}
<li><a href="{{ item.link }}">{{ item.title }}</a></li>
<br><div class="description">{{ item.date }}
<span class="pink">[{{ item.topicTag }}]</span>
{{ item.name }} <span class="pink">[{{ item.city }}]</span>
</div>
{% endfor %}
</ul>
{% endif %}
{% endblock %}

当然,所有带有 * 作为 EventsPage 模型属性的“item.*”都不起作用。我很确定我走错了路,但请我需要帮助来做到这一点。

最佳答案

首先,{{ item.date }}无法工作,因为 itemRelatedLink对象,而不是页面对象。要访问页面对象,您需要 {{ item.link_page.date }} (当然,还有一些当编辑器提供 link_external 而不是 link_page 时的替代行为)。但是,这种更改本身是不够的 - 它适用于核心页面属性,如 item.link_page.title ,但不是特定于事件的事件,例如 date .

为什么会发生这种情况的解释:每当您检索一组页面时,通过类似 EventPage.objects.all() 的操作, 或 page.get_children()或(在这种情况下)page.related_links ,那么通常所有的结果都是相同的类型。如果这是一个可能覆盖多种不同类型页面的操作(例如 - EventPage.objects.all() 只能返回 EventPage 对象,但 page.get_children()page.related_links 可以返回任何类型的页面),那么为了保持它们全部同样,它必须将它们作为“最低公分母”返回 - 所有页面类型都源自的基本页面模型。这提供了诸如 title 之类的字段。对所有页面都是通用的,但没有特殊用途的字段。

(这是数据库查找工作方式的一个限制——如果我们想以最具体的形式获取每个页面对象,数据库查询必须一次检查所有与页面相关的表,这非常低效。)

考虑到这一点,您有几个选择:

首先,如果您知道您网站上的编辑只会选择 EventPage s 作为相关链接 - 根据您的 help_text 以及您正在编写诸如 {{ item.date }} 之类的内容这一事实,这似乎是一个安全的假设。和 {{ item.city }}这对于其他类型的页面可能没有意义 - 然后您可以通过将外键指向 EventPage 在数据库级别强制执行此操作。 :

link_page = models.ForeignKey(
'myapp.EventPage', # replace 'myapp' with your application name
null=True,
on_delete=models.SET_NULL,
blank=True,
related_name='+',
help_text='Choose an existing page (event must have already been created)',
)

进行此更改后,Wagtail 管理中的页面选择器将只允许您选择 EventPage s 表示该字段,以及 item.link_page会给你满满的 EventPage对象,允许你写 {{ item.link_page.date }} .

其次:如果您需要在相关链接中支持其他页面类型——例如,也许您有一个 NewsPage型号也有 date字段,并且希望也能够选择这些作为相关链接 - 那么您可以转换基本的 Page通过调用 .specific 将对象转换为更具体的页面类型在上面。例如: {{ item.link_page.specific.date }} .缺点是 .specific每次使用时都会执行额外的数据库查找,这可能会损害性能。作为一个简单的优化,您可以使用 {% with %}标记以将其分配给变量:
{% for item in page.related_links.all %}
{% with item.link_page.specific as related_page %}
<li><a href="{{ item.link }}">{{ item.title }}</a></li>
<br><div class="description">{{ related_page.date }}
<span class="pink">[{{ related_page.topicTag }}]</span>
{{ related_page.name }} <span class="pink">[{{ related_page.city }}]</span>
</div>
{% endwith %}
{% endfor %}

关于python-2.7 - 访问模板文件 Wagtail 中的子页面模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34816061/

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