2012-07-05 65 views
3

我目前正在嘗試覆蓋Django 1.4中使用的默認窗體登錄到管理網站(我的網站使用一個額外的'令牌'字段用戶需要選擇雙因素身份驗證,對於網站工作人員是強制性的)。 Django的默認表單不支持我所需要的。目前,我在我的templates/目錄中有一個名爲templates/admin/login.html的文件,該文件似乎正確覆蓋了我在整個網站中使用的模板。該文件的內容如下簡單:Django - 覆蓋管理網站的登錄表格

# admin/login.html: 
{% extends "login.html" %} 

實際登錄表單是如下:

# login.html: 
{% load url from future %}<!DOCTYPE html> 
<html> 
    <head> 
     <title>Please log in</title> 
    </head> 
    <body> 
     <div id="loginform"> 
      <form method="post" action="{% url 'id.views.auth' %}"> 
       {% csrf_token %} 
       <input type="hidden" name="next" value="{{ next }}" /> 
       {{ form.username.label_tag }}<br/> 
       {{ form.username }}<br/> 
       {{ form.password.label_tag }}<br/> 
       {{ form.password }}<br/> 
       {{ form.token.label_tag }}<br/> 
       {{ form.token }}<br/> 
       <input type="submit" value="Log In" /> 
      </form> 
     </div> 
    </body> 
</html> 

我的問題是,形式使用我的正常登錄的網址,因爲提供的工作完全正常訪問時我提供我自己的AuthenticationForm作爲要顯示的表單,但通過Django Admin登錄路由,Django喜歡將自己的表單提供給此模板,因此只有usernamepassword字段呈現。有什麼辦法可以讓這項工作成功嗎?或者說,我只是將HTML字段'硬編碼'爲表單中的內容而已?

回答

6

AdminSite有一個login_form屬性,您可以使用它來覆蓋所使用的表單。

子類AdminSite然後用你的子類,而不是django.contrib.admin.site的實例,在管理註冊您的車型,在urls.py等

這一切都在documentation

+1

這個幾乎奏效:我現在唯一的問題是重寫此類會導致.autodiscover()方法停止工作。刪除此操作會從管理網站中刪除我的所有模型。我不確定如何從另一個應用程序的admin.py模塊明確導入管理模型,這是可能的(或者更好,我們可以爲我的新子類AdminSite啓用autodiscover()嗎?) – 2012-07-15 07:48:49

0

也許使用模板標籤獲取您的自定義AuthenticationForm

5

這段代碼在urls.py工作正常,我(Django的版本1.5.1):

from django.contrib import admin 
from my.forms import AuthenticationForm 

admin.autodiscover() 
admin.site.login_form = AuthenticationForm 
+0

Django 1.6.1也是如此。 – 2013-12-23 21:16:57

+0

只是爲了完成這個答案:如果你以某種方式改變表單的字段,你還需要覆蓋'admin/login.html'模板,通常覆蓋'{%block content%}'。 – Caumons 2017-11-24 12:02:14

0

我知道這是一個古老的線程,但我想補充一點就幫我找到了,在情況下,它可以幫助別人。

我正在使用特殊的遠程身份驗證(Shibboleth),並且重寫admin login_form將不夠。我有一個使用cookies和返回變量和重定向到遠程身份驗證提供者的觀點,等等

所以我做的方式是:

from my_app.views import user_login, user_logout 
admin.autodiscover() 
admin.site.login = user_login 
admin.site.logout = user_logout 

的偉大工程! 感謝@dgk

7

Holá
我發現了一個非常簡單的解決方案。
你只需要修改項目(注意,不是應用程序之一)

  1. 的urls.py FLE在項目文件夾找到該文件urls.py.
  2. 此行添加到進口部
    from your_app_name import views
  3. 定位此線
    url(r'^admin/', include(admin.site.urls))
  4. 添加上面那行以下
    url(r'^admin/login/', views.your_login_view),

這是一個例子

from django.conf.urls import include, url 
from django.contrib import admin 

from your_app import views 

urlpatterns = [ 
    url(r'^your_app_start/', include('your_app.urls',namespace="your_app_name")), 

    url(r'^admin/login/', views.your_app_login), 
    url(r'^admin/', include(admin.site.urls)), 
]