当用户没有所需的权限时,Django PermissionRequiredMixin无法正常工作

时间:2016-10-03 22:31:51

标签: django django-permissions

好的,我有这个视图,我使用django PermissionRequiredMixin,当用户拥有change_item权限我指定那里一切正常

from django.contrib.auth.mixins import PermissionRequiredMixin

class MyView(PermissionRequiredMixin,View):

    template = 'myapp/item_detail.html'
    permission_required = 'myapp.change_item'


    def get(self, request, *args, **kwargs):
        #Query here
        return render(request, self.template)

但是,当用户没有它时,我得到一个404错误页面,说myapp / login它无效:

**Page not found (404)
Request Method:     GET
Request URL:    http://127.0.0.1:8000/myapp/login?next=/myapp/item/35/**
The current URL, myapp/login, didn't match any of these.

登录它在设置LOGIN_URL中设置并与其他所有内容完美配合...但不是这个,我也看到一个登录字符串它位于错误的URL中间...我错过了一些关于mixins?,我做错了什么?

我添加了urls.py:

from django.conf.urls import url
from .views.views_home import HomeView, WelcomeView
from .views.views_authentication import LoginView, LogoutView, ChangePasswordView

urlpatterns = [
    url(r'^welcome/$', WelcomeView.as_view(), name="welcome"),
    url(r'^home/$', HomeView.as_view(), name="home"),
    url(r'^login/$', LoginView.as_view(), name="login"),
    url(r'^logout/$', LogoutView, name="logout"),
    url(r'^change_password/$', ChangePasswordView.as_view(), name="change_password"),

]

堆栈跟踪:

[03/Oct/2016 17:04:47] "GET /myapp/item/35/ HTTP/1.1" 302 0
Not Found: /myapp/login
[03/Oct/2016 17:04:47] "GET /myapp/login?next=/myapp/item/35/ HTTP/1.1" 404 32312

提前致谢!!

1 个答案:

答案 0 :(得分:1)

使用PermissionRequiredMixin时,您可以使用settings.py中的LOGIN_URL将用户重定向到当前页面。如果myapp / login /不是正确的位置,请使用此设置指定正确的位置。另外,您可以在视图中添加login_url类成员,也可以添加get_login_url()方法,而不是使用settings.LOGIN_URL。

所有这些都假设myapp / login不是正确的位置,如果这确实是您希望用户重定向到的位置,那意味着您在urls.py中有错误

最后但并非最不重要的是,在使用DRF时,习惯使用DjangoModelPermissions代替PermissionRequiredMixin