通过包含标记传递上下文变量
Posted
技术标签:
【中文标题】通过包含标记传递上下文变量【英文标题】:Pass a context variable through an inclusion tag 【发布时间】:2012-08-18 06:43:44 【问题描述】:执行检查以查看用户是否参加。如何将上下文变量is_attending
传递给模板而不在'is_attending': context['is_attending']
上出现语法错误?检查基本上是针对样式 div 和诸如此类的。我做错了什么?
模板:
% for event in upcoming %
% registration %
% if is_attending %
Registered!
% else %
Register button
% endif %
yadda yadda divs...
% endfor %
filters.py
@register.inclusion_tag('events/list.html', takes_context=True)
def registration(context, event):
request = context['request']
profile = Profile.objects.get(user=request.user)
attendees = [a.profile for a in Attendee.objects.filter(event=event)]
if profile in attendees:
'is_attending': context['is_attending']
return is_attending
else:
return ''
谢谢!
【问题讨论】:
【参考方案1】:'is_attending': context['is_attending']
不是有效的 python。相反,它看起来像一个部分字典。由于.inclusion_tag()
代码应该返回一个字典,也许你的意思是:
if profile in attendees:
return 'is_attending': context['is_attending']
else:
return 'is_attending': ''
另请注意,takes_context
表示您将仅将上下文作为参数。来自howto on custom tags:
如果在创建模板标签时指定了takes_context,标签将没有必需的参数,而底层Python函数将有一个参数——调用标签时的模板上下文。
因此你的标签应该是:
% registration %
您的完整方法可以直接从上下文中获取event
参数:
@register.inclusion_tag('events/list.html', takes_context=True)
def registration(context):
request = context['request']
event = context['event']
profile = Profile.objects.get(user=request.user)
attendees = [a.profile for a in Attendee.objects.filter(event=event)]
if profile in attendees:
return 'is_attending': context['is_attending']
else:
return 'is_attending': ''
【讨论】:
感谢您的建议。但是,由于% registration event %
的模板语法错误,我仍然无法传递“is_attending”。我没有正确调用它吗?
@Modelesq:为你更新了答案; takes_context
包含标记方法只接受 context
参数。
模板是一个事件列表。循环遍历事件,必须进行检查。因为这是通过特定活动的参与者列表进行过滤。我需要有% registration event %
,否则它不会过滤Attendee.objects.filter(event=event)
并执行检查。
@Modelesq:但是当包含标签时,context
将保存您想要传入的当前event
。当您执行% registration event %
时,该语句中的event
值也 在上下文中查找。查看我的registration
方法版本,它从上下文对象中检索事件。
错过了。谢谢你。但同样,我仍然收到该模板语法错误。我会继续玩它。我已经更新了我的帖子,也许我错过了一些东西,或者可能包含标签不是要走的路?以上是关于通过包含标记传递上下文变量的主要内容,如果未能解决你的问题,请参考以下文章