【发布时间】:2019-07-25 22:58:32
【问题描述】:
我想找到一种方法,在 Django for 循环中使用键值查找来查找第二个模型。
This question 在模板中的字典键值循环上是正确的,但我使用的是两个规范化数据模型。有一个包含相关链接的“父”数据对象 (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 %}
models.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)
views.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 对象会占用数据库中的大量额外空间。
【问题讨论】:
-
为了后代,我添加了一个使用“模板片段缓存”的快速解决方法:docs.djangoproject.com/en/2.1/topics/cache/…。这对我很有帮助,但我可能确实需要在我的模型上做一些工作,正如@Endre Both 所指出的那样
标签: python django django-templates