使用 Django "is_superuser" 是否需要额外的 URL?
Does using Django "is_superuser" require additional URL?
我正在为 Django 1.7 项目创建管理 interface/dashboard。我没有从头开始创建新的管理应用程序,而是尝试使用 Django 的内置管理站点。我有 "root"(超级用户)和 "reviewer"(非超级用户)员工帐户。这两个帐户都在默认的 "admin" 组中。这两个帐户都可以登录到管理站点,但某些页面可以由 root 帐户和审阅者帐户访问,而对其他帐户的访问仅限于超级用户。我创建了以下两个视图:
# 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.
我还需要做些什么来实现这个仅限超级用户的视图和模板,以便在审阅者单击 link 时不会发生此错误吗?
我遵循 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'),
)
然后用户没有通过测试 django 将其重定向到登录页面。此页面的默认 url 是 /accounts/login/
。将 LOGIN_URL
设置设置为管理员的登录页面:
LOGIN_URL = 'admin:login'
或者,如果网站上有非员工用户,请在 urls.py
:
中设置身份验证 urls
url('^accounts/', include('django.contrib.auth.urls')),
但这需要您创建多个模板(登录、注销、更改密码等)
更新:如果你想在登录页面显示一条消息,那么你可以为管理员创建custom login template。将此行添加到您的 urls.py
:
admin.site.login_template = 'my_login.html'
然后创建从 admin/login.html
:
扩展而来的 my_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
或通过在您的 [=17= 中包含 django.contrib.auth.urls
来实施身份验证] 然后你可以将 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)
我正在为 Django 1.7 项目创建管理 interface/dashboard。我没有从头开始创建新的管理应用程序,而是尝试使用 Django 的内置管理站点。我有 "root"(超级用户)和 "reviewer"(非超级用户)员工帐户。这两个帐户都在默认的 "admin" 组中。这两个帐户都可以登录到管理站点,但某些页面可以由 root 帐户和审阅者帐户访问,而对其他帐户的访问仅限于超级用户。我创建了以下两个视图:
# 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.
我还需要做些什么来实现这个仅限超级用户的视图和模板,以便在审阅者单击 link 时不会发生此错误吗?
我遵循 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'),
)
然后用户没有通过测试 django 将其重定向到登录页面。此页面的默认 url 是 /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'
然后创建从 admin/login.html
:
my_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
或通过在您的 [=17= 中包含 django.contrib.auth.urls
来实施身份验证] 然后你可以将 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)