有一个注册按钮可以为该特定事件创建一个参加者。(可行)。但是,点击“注册”后,模板会识别'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')
答案 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 tag或inclusion tag。