Django模板标签中的结果相同

时间:2012-08-13 20:12:07

标签: python django django-templates

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

查看:

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 个答案:

答案 0 :(得分:1)

每次进行for循环时,你都会覆盖is_attending的值;您的模板会看到is_attending的{​​单个)值,upcoming是否有request.user中的最后一个事件设置。

要获得所需的行为,请为每个 is_attending添加一条Event个信息。我认为最简单的方法是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