Django - 如何在自定义模板标签中使用'if'和'else'?

23 投票
1 回答
18832 浏览
提问于 2025-04-17 23:16

我用Python做了一个自定义的模板标签,用来处理权限:

register = template.Library()

@register.simple_tag
def get_user_perm(request, perm):
    try:
        obj = Profile.objects.get(user=request.user)
        obj_perms = obj.permission_tags.all()
        flag = False
        for p in obj_perms:
            if perm.lower() == p.codename.lower():
                flag = True
                return flag
        return flag
    except Exception as e:
        return ""

然后我在我的模板中这样加载和使用它:

{% load usr_perm %}
{% get_user_perm request "add_users" %}

这样就会输出True。现在我想用它来检查用户是否有权限。请问我该如何在模板中用ifelse条件来使用这个模板标签呢?目前我这样使用:

{% if get_user_perm request "add_users" %}Can Add User{% else %} Permission Denied {% endif %}

有没有办法可以调整模板标签的代码,或者有什么提示可以让我在模板中使用这个标签呢?
另外,我之前是用Django的权限系统,像这样使用{% if perms.profile.add_user %},但因为一些原因我现在需要自己写一个模板标签!
任何帮助都会非常感谢!谢谢

1 个回答

52

你应该使用 Assignment tags

register = template.Library()

@register.assignment_tag(takes_context=True)
def get_user_perm(context, perm):
    try:
        request = context['request']
        obj = Profile.objects.get(user=request.user)
        obj_perms = obj.permission_tags.all()
        flag = False
        for p in obj_perms:
            if perm.lower() == p.codename.lower():
                flag = True
                return flag
        return flag
    except Exception as e:
        return ""

然后在模板中加载标签后,像这样使用它:

{% get_user_perm "add_users" as add_users_flag %}
## you can check like this
{% if add_users_flag %} {% else %} {% endif %}

撰写回答