通过包含标记传递上下文变量

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 方法版本,它从上下文对象中检索事件。 错过了。谢谢你。但同样,我仍然收到该模板语法错误。我会继续玩它。我已经更新了我的帖子,也许我错过了一些东西,或者可能包含标签不是要走的路?

以上是关于通过包含标记传递上下文变量的主要内容,如果未能解决你的问题,请参考以下文章

Django:不能将变量传递给包含的模板?

在 Django 中,是不是可以从包含标记内的父模板上下文访问当前用户会话?

垃圾回收机制

使用 Grunt 将变量传递给 SASS

笔记:原始值与引用值执行上下文与作用域垃圾回收

Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?