【发布时间】:2016-04-26 23:38:09
【问题描述】:
假设我有一个使用 user_passes_test 装饰器装饰的视图:
# myapp/views.py
from django.views.generic import TemplateView
from django.contrib.auth.decorators import user_passes_test
def has_perm1_or_perm2(user):
return user.has_perm('myapp.perm1') or user.has_perm('myapp.perm2')
@user_passes_test(has_perm1_or_perm2)
class MyView(TemplateView):
# my view code goes here
然后我将它连接到一个 URL,如下所示:
# myapp/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
...,
url(r'^myview$', views.MyView.as_view(), name='myview'),
...
]
如果我想在模板中放置一个指向该视图的链接,它看起来像:
<a href="{% url 'myapp:myview' %}">Check out my view!</a>
但我希望能够在模板中添加一些控制,以便仅当当前登录的用户被为视图指定的user_passes_test 函数批准时才会显示上述内容。
即我想让我的模板看起来像:
{% if check_user_has_view_permission request.user 'myapp:myview' %}
<a href="{% url 'myapp:myview' %}">Check out my view!</a>
{% else %}
Nothing to see here...
{% endif %}
我怎样才能做到这一点?
谢谢!
【问题讨论】:
-
请注意,
user_passes_test装饰器用于过程视图。对于基于类的视图,您需要使用a mixin。 -
感谢您抽出宝贵时间发表评论。我曾认为在过去,可以装饰基于类的视图。这是 1.9 中的新事物,您需要为 CBV 使用 mixins 吗?或者它只是 CBV 上与权限相关的装饰器?还是只是建议这样做,但装饰器方法仍然有效?
-
装饰器无法正常工作。在 Django 1.9 之前,您必须编写自己的 mixins 或装饰视图的
dispatch方法。 -
我认为文档表明类装饰方法有效(只要您将装饰器包装在
method_decorator函数中):docs.djangoproject.com/es/1.9/topics/class-based-views/intro/… -
从您引用的链接中:“要装饰基于类的视图的每个实例,您需要装饰类定义本身。为此,您将装饰器应用于
dispatch()类的方法。"
标签: django django-templates django-authentication