我正在为Django 1.7项目创建一个管理接口/仪表板。我不是从头开始创建一个新的管理应用程序,而是尝试使用Django的内置管理站点。我有“根”(超级用户)和“审阅者”(非超级用户)人员帐户。这两个帐户都在默认的"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指令,在mysite/app/admin/ templates /admin目录中创建了自己的Django的base.html、base_site.html和index.html模板的副本,然后在index.html页面底部添加了"all_admins“和"superuser_only”锚。
这是我的档案:
# 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'),
)发布于 2015-02-11 01:27:12
然后用户不会通过测试django将其重定向到登录页面。此页面的Defult url为/accounts/login/。将LOGIN_URL设置设置为管理员的登录页面:
LOGIN_URL = 'admin:login'或者,如果站点上有编外用户,请在urls.py中设置auth url。
url('^accounts/', include('django.contrib.auth.urls')),但这将要求您创建多个模板(登录、注销、更改密码等)。
UPDATE:如果您想在登录页面中显示一条消息,那么您可以为自定义登录模板创建自定义登录模板。将这一行添加到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 %}UPDATE 2:如果您不想通过在urls.py中包含django.contrib.auth.urls来更改站点范围的LOGIN_URL或实现auth,那么可以将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)https://stackoverflow.com/questions/28444988
复制相似问题