由于业务原因需要在Django模版中自定义一种权限过滤方式,作用类似于django auth系统中提供的 permissions filter.
下面是我看到一种写法,实现起来比较简单,用起来也比较简单 django-user-permissions-in-your-templates
如果没有做过自定义filter的同学可以看 howto-custom-template-tags 这部分文档,下面是搬运的示例代码。
filter部分代码
from django import template
register = template.Library()
@register.filter
def can_edit(user, obj):
user_can_edit = False
if user.is_authenticated:
if user.is_superuser:
user_can_edit = True
else:
if obj and obj.user and obj.user == user:
user_can_edit = True
return user_can_edit
模版中的写法
{% if user|can_edit:my_obj %}
<a href="{% url 'my_obj:edit' my_obj.id %}">
Edit object
</a>
{% endif %}
上面的写法业务含义是 当前用户是否可以编辑 my_obj
这个对象,已经可以精确到单个资源的权限控制了。
如果是粗粒度的权限,例如是否显示某个菜单,可以把 filter做成类似 user|check_perms:"add_new_student"
,还可以使用 user|check_perms:"add_new_student"|can_edit:my_obj
类似的方式完成细粒度的资源控制
开始的时候并没有想到可以在 if
中使用filter,还是需要多看源码呀。