【问题标题】:Pass a context variable through an inclusion tag通过包含标记传递上下文变量
【发布时间】:2023-04-07 11:24:01
【问题描述】:

执行检查以查看用户是否参加。如何将上下文变量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 ''

谢谢!

【问题讨论】:

    标签: python django django-custom-tags


    【解决方案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 方法版本,它从上下文对象中检索事件。
    • 错过了。谢谢你。但同样,我仍然收到该模板语法错误。我会继续玩它。我已经更新了我的帖子,也许我错过了一些东西,或者可能包含标签不是要走的路?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2018-08-30
    • 2019-08-05
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多