如何在Django模板的if语句中使用自定义模板标签?

3 投票
2 回答
3124 浏览
提问于 2025-04-17 15:12

我做了一个Django的模板标签,用来计算我自定义用户的多对多字段的长度:

from django import template

register = template.Library()

@register.simple_tag(takes_context=True)
def unread_messages_count(context):
    user = context['request'].user
    return len(user.messages_unread.all())

然后在模板里,我想只在这个长度大于零的时候才显示给用户,所以我试了:

{% ifnotequal unread_messages_count 0 %}
   some code...
{% endifnotequal %}

但显然这样不行,连用'with'语句也不行:

{% with unread_messages_count as unread_count %}
    {% ifnotequal unread_count 0 %}
        some code...
    {% endifnotequal %}
{% endwith %}

我该怎么检查这个变量是否大于0,只有在它大于0的时候,才给用户展示一些代码(包括这个变量本身的数字)。谢谢。

2 个回答

2

你可以使用Django的自定义过滤器,具体可以参考这个链接:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

def unread_messages_count(user_id):
  # x = unread_count   ## you have the user_id
  return x

然后在模板中使用它

{% if request.user.id|unread_messages_count > 0 %}
  some code...
{% endif %}
9

最简单的方法就是使用一个赋值标签。

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#assignment-tags

@register.assignment_tag(takes_context=True)
def unread_messages_count(context):
    user = context['request'].user
    return len(user.messages_unread.all())

{% unread_messages_count as cnt %}
{% if cnt %}
   foo
{% endif %}

撰写回答