python - 在 Django 循环模板中对第二个模型使用键值查找?
问题描述
我想找出一种在 Djangofor
循环中对第二个模型使用键值查找的方法。
这个关于模板中字典键值循环的问题是正确的,但我使用的是两个规范化数据模型。有一个EventDetail
包含相关链接的“父”数据对象 () 和一个包含DateEvent
用户操作数据的特定日期信息的“子”数据对象 ()。
我有一个模板标签,link_if_exists
它被重复了很多次。Django-debug-toolbar 告诉我这现在被重复了 76 次。这个“重复”消息本身就被重复了很多次。
这就是我现在所拥有的:
app_extras.py
@register.filter()
def link_if_exists(title):
"""Return a link if it exists"""
event_link = None
try:
event_link = EventDetail.objects.filter(title=title).values_list('link', flat=True)[0]
except IndexError:
pass
if event_link != "":
return event_link
return False
模板.html
{% load 'app_extras' %}
{% for item in child_date_items %}
{% if item.title|link_if_exists %}
<a href="{{item.title|link_if_exists}}">{{item.title}}</a>
{% endif %}
{% endfor %}
模型.py
class DateEvent(models.Model)
title = models.CharField(max_length=250)
event_date = models.DateField(default=date.today)
event_datetime = models.DateTimeField(auto_now=False)
class EventDetail(models.Model)
title = models.CharField(max_length=250)
link = models.URLField(max_length=200, default="", blank=True)
视图.py
class ProblemView(TemplateView):
template_name = "template.html"
def get_context_data(self, **kwargs):
context = super(ProblemView, self).get_context_data(**kwargs)
date_today = utils.get_date_today()
child_date_items = DateEvent.objects.filter(event_date=date_today)
context['child_date_items'] = child_date_items
return context
Django 调试工具栏输出
SELECT link FROM
table WHERE title='title'
...
| duplicated 74 times
像这样的东西是我所追求的:
将“event_detail”添加到views.py
class NewView(TemplateView):
template_name = "template.html"
def get_context_data(self, **kwargs):
context = super(NewView, self).get_context_data(**kwargs)
date_today = utils.get_date_today()
child_date_items = DateEvent.objects.filter(event_date=date_today)
context['child_date_items'] = child_date_items
event_detail = EventDetail.objects.all()
context['event_detail'] = event_detail
return context
查找标题作为在 Ideal_template.html 中获取“链接”值的关键
{% for item in child_date_items %}
{% if event_detail[item.title]['link'] %}
<a href="event_detail[item.title]['link']">{{item.title}}</a>
{% endfor %}
{% endfor %}
我不知道这个功能是否存在,所以我愿意接受其他建议。我也愿意views.py
在模板中计算并迭代一个公共对象。我知道我可以复制链接数据并在DateEvent
模型中添加一个链接列,但这似乎很浪费,如果可能的话我想避免这种情况。这不是我需要这种类型逻辑的唯一字段,因此将所有内容添加到 Child 对象会占用数据库中的大量额外空间。
解决方案
你需要对你的模型做一些工作。如果它们之间存在一对多的关系(几个DateEvent
s 对应一个EventDetail
),那么与其title
手动复制它们然后再次手动链接它们,您应该在模型级别正式确定关系:
class EventDetail(models.Model)
title = models.CharField(max_length=250)
link = models.URLField(max_length=200, default="", blank=True)
class DateEvent(models.Model)
event_detail = models.ForeignKey(EventDetail, on_delete=models.CASCADE)
event_date = models.DateField(default=date.today)
event_datetime = models.DateTimeField(auto_now=False)
然后,您可以在没有任何条件和重复查询的情况下从任何对象引用该link
字段DateEvent
(如果您正确使用select_related())。
因此,如果您正在使用DateEvent
s,您将使用:
date_events = (
DateEvent.objects
.filter(event_date=date_today)
.select_related('event_detail')
)
然后,在模板中:
{% for item in child_date_items %}
<a href="{{item.event_detail.link}}">{{item.event_detail.title}}</a>
{% endfor %}