【问题标题】:Same results within Django template tagsDjango 模板标签中的相同结果
【发布时间】: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')

【问题讨论】:

    标签: python django django-templates


    【解决方案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 taginclusion tag

    【讨论】:

    • @Daniel 我不认为这是一个公平的批评。你可以使用annotate,但 OP 对 Django 来说显然是相对较新的。概念的简单性和执行的效率肯定高吗?
    • 我确实是新人。我正在研究分配标签。我非常感谢您的反馈。
    • @Daniel 但是,我已将其重写为每个Event 1 个查询,希望您不再认为它不可接受。
    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多