对循环的Django模板中的第二个模型使用KeyValue查找?

2024-04-19 01:52:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找出一种方法,在Djangofor循环中为第二个模型使用键值查找。你知道吗

This question在dictionary上模板中的键值循环是正确的,但是我使用了两个规范化的数据模型。“父”数据对象(EventDetail)包含相关链接,而“子”数据对象(DateEvent)包含特定于日期的信息以及有关用户操作的数据。你知道吗

我有一个模板标记link_if_exists,它被多次复制。Django调试工具栏告诉我这是被复制76次了。“重复”消息本身重复了很多次。你知道吗

这就是我现在拥有的:

应用程序_额外费用

@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

像这样的东西正是我想要的:

将“事件详细信息”添加到视图.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

查找标题作为键以获取理想中的“链接”值_模板.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模型中添加一个链接列,但这似乎是浪费,如果可能的话,我希望避免这种情况。这不是我需要这种类型逻辑的唯一字段,因此将所有内容添加到子对象将占用数据库中的大量额外空间。你知道吗


Tags: event模板childgettodaydateiftitle
1条回答
网友
1楼 · 发布于 2024-04-19 01:52:55

你需要对你的模型做些工作。如果它们之间存在一对多关系(一个EventDetail有几个DateEvent),那么您应该在模型级别对关系进行形式化,而不是手动复制它们中的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)

然后可以从任何DateEvent对象引用link字段,而不使用任何条件和重复查询(如果正确使用select_related())。你知道吗

因此,如果您使用的是DateEvent,您可以使用:

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 %}

相关问题 更多 >