使用Django“is_superuser”是否需要额外的URL?

时间:2015-02-11 01:20:04

标签: django django-templates django-views

我正在为Django 1.7项目创建管理界面/仪表板。我试图使用Django的内置管理站点,而不是从头开始创建一个新的管理应用程序。我有“root”(超级用户)和“reviewer”(非超级用户)员工帐户。这两个帐户都在默认的“admin”组中。两个帐户都可以登录管理站点,但是根帐户和审阅者帐户都可以访问某些页面,而对其他帐户的访问权限仅限于超级用户。我创建了以下两个视图:

# mysite/apps/admin/views.py
from django.shortcuts import render
from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.is_staff)
def all_admins(request, template):
    return render(request, template)

@user_passes_test(lambda u: u.is_superuser)
def superuser_only(request, template):
    return render(request, template)

我遇到的问题是,如果我使用审阅者帐户登录并单击“superuser_only”页面的锚点,则会出现以下错误:

Page not found (404)
    Request Method: GET
      Request URL:  http://localhost:8001/accounts/login/?next=/admin/super/
Using the URLconf defined in conf.urls, Django tried these URL patterns, in this order:
^admin/
^admin/all_admins/$ [name='all-admins']
^admin/super/$ [name='superuser-only']
The current URL, accounts/login/, didn't match any of these.

我是否还需要做一些其他事情来实现这个仅限超级用户的视图和模板,以便在审阅者点击链接时不会发生此错误?

我跟着Django docs instructions并在我的mysite / apps / admin / templates / admin目录中创建了自己的Django base.html,base_site.html和index.html模板副本,然后添加了“all_admins”和“superuser_only”锚点到index.html页面的底部。

以下是我的文件:

# part of mysite/mysite/settings.py
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'apps/admin/templates'),
os.path.join(BASE_DIR, 'apps/admin/templates/admin'),)

# mysite/mysite/urls.py
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),

    url(r'^admin/all_admins/$',
        'apps.admin.views.all_admins',
        {'template': 'all_admins.html'},
        name='all-admins'),

    url(r'^admin/super/$',
        'apps.admin.views.superuser_only',
        {'template': 'superuser_only.html'},
        name='superuser-only'),
)

1 个答案:

答案 0 :(得分:0)

然后用户没有通过测试django将其重定向到登录页面。此页面的Defult网址为/accounts/login/。将LOGIN_URL设置设置为管理员的登录页面:

LOGIN_URL = 'admin:login'

或者,如果您在网站上有非员工用户,请在urls.py中设置身份验证网址:

url('^accounts/', include('django.contrib.auth.urls')),

但是这需要你创建几个模板(登录,注销,更改密码等)。

更新:如果您想在登录页面中显示消息,则可以为管理员创建custom login template。将此行添加到urls.py

admin.site.login_template = 'my_login.html'

然后创建my_login.html模板,该模板从admin/login.html扩展:

{% extends 'admin/login.html' %}

{% block content %}

    {% if user.is_staff %}
        <p class="errornote">You need to be a superuser to access that page.</p>
    {% endif %}

    {{ block.super }}

{% endblock %}

更新2 :如果您不希望更改网站范围LOGIN_URL或通过在django.contrib.auth.urls中添加urls.py来实施身份验证,那么您可以将login_url参数传递给@user_passes_test装饰器:

@user_passes_test(lambda u: u.is_superuser, login_url='/admin/login/')
def superuser_only(request, template):
    return render(request, template)