Django 模板标签中的相同结果

Posted

技术标签:

【中文标题】Django 模板标签中的相同结果【英文标题】:Same results within Django template tags 【发布时间】:2012-08-10 02:40:15 【问题描述】:

有一个注册按钮,可以为该特定活动创建参加者。(有效)。但是,单击“注册”后,模板会为upcoming 中的每个事件识别'is_attending'= True(已注册!)。

查看:

def index(request):
    upcoming = Event.objects.filter(date__gte=datetime.now())
    if request.user.is_authenticated():
        profile = Profile.objects.get(user=request.user)
    is_attending = False
    for event in upcoming:
        attendees = [a.profile for a in Attendee.objects.filter(event=event)]
        if profile in attendees:
            is_attending = True

模板

% if is_attending %
     <a><Registered!</a>
% else %
     <form>... registration form ... Register Now...

我猜发生了什么:

event 1  : Registered!
event 2  : Registered!
event 3  : Registered!

当我需要的是:

event 1  : Registered!
event 2  : Register Now
event 3  : Register Now

我不太确定为什么这对我不起作用?我如何循环返回is_attending,只为那些在upcoming事件中注册的人?

型号:

class Attendee(models.Model):
    event = models.ForeignKey(Event)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    profile = generic.GenericForeignKey('content_type', 'object_id')

【问题讨论】:

【参考方案1】:

每次执行 for 循环时,您都会覆盖 is_attending 的值;您的模板会看到 is_attending 的(单个)值,这取决于 upcoming 中的最后一个事件是否由 request.user 参加。

要获得所需的行为,请为每个 Event 提供一条is_attending 信息。我认为最简单的方法是with a custom template tag:

@register.simple_tag(takes_context=True)
def user_is_attending(context, event):
    if type(event) != Event:
        raise template.TemplateSyntaxError("Must provide event")
    request = context['request']
    if event.attendee_set.filter(profile__user=request.user).exists():
        return 'attending'
    else:
        return 'not attending'

然后,当你在模板中循环你的事件时:

% user_is_attending event %

您也可以根据需要考虑使用assignment tag 或inclusion tag。

【讨论】:

@Daniel 我不认为这是一个公平的批评。你可以使用annotate,但 OP 对 Django 来说显然是相对较新的。概念的简单性和执行的效率肯定高吗? 我确实是新人。我正在研究分配标签。我非常感谢您的反馈。 @Daniel 但是,我已将其重写为每个Event 1 个查询,希望您不再认为它不可接受。

以上是关于Django 模板标签中的相同结果的主要内容,如果未能解决你的问题,请参考以下文章

django模板的导入

在 Django URL 模板标签内使用语义 UI 的查询结果

Django模板如何对简单标签返回的结果应用过滤器

使用 Django 模板设置默认值

如何在 Django 模板中的“带有模板标签”中设置 Django 渲染块值?

django模板继承使用相同标签多个模板