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 URL 模板标签内使用语义 UI 的查询结果