2015-02-11 66 views
0

我正在爲Django 1.7項目創建一個管理界面/儀表板。我試圖使用Django的內置管理站點,而不是從頭創建一個新的管理應用程序。我有「root」(超級用戶)和「審閱者」(非超級用戶)員工賬戶。這兩個帳戶都在默認的「管理員」組中。這兩個帳戶都可以登錄到管理網站,但有些頁面可以被root用戶和審閱者帳戶訪問,而對其他用戶的訪問僅限於超級用戶。我創建了以下兩個觀點:使用Django「is_superuser」是否需要額外的URL?

# 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'), 
) 

回答

0

然後用戶沒有通過測試的Django重定向到登錄頁面。此網頁的歪曲網址是/accounts/login/。該LOGIN_URL設置設置爲管理員的登錄頁面:

LOGIN_URL = 'admin:login' 

或者,如果你有在網站上的非員工用戶,在urls.py設置身份驗證網址:

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

但這就需要你創建多個模板(登錄,註銷,更改密碼等)

UPDATE:如果你想顯示在登錄頁面的消息,那麼你可以創建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或通過在您的urls.py中包含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) 
+0

很好。這實際上起作用,它可以防止顯示錯誤,但如果我以審閱者的身份登錄,並且現在單擊「超級用戶」鏈接,則不會發生任何事情。我想至少顯示一個模板,告訴審閱者他們需要成爲超級用戶才能訪問該頁面。也許我必須將視圖中的「is_superuser」變量傳遞給模板,並且只顯示指向不需要查看器成爲超級用戶的頁面的鏈接?這會讓我解決問題。 – William 2015-02-11 01:40:02

+0

我不太明白。這是什麼文件?如果我把它放在「登錄」中。我的mysite/apps/admin/templates/admin目錄中的「html」文件中,我在login.html文件中的「{%extends ...%}標記中收到錯誤」調用Python對象時超出最大遞歸深度「創建。 – William 2015-02-11 02:36:51

+0

你不應該創建'admin/login.html'模板。創建您自己的模板並從'login.html'擴展它。然後配置'admin.site'來使用你的模板而不是'admin/login.html'。查看更新後的答案。 – catavaran 2015-02-11 02:51:55

相關問題