2012-07-05 67 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)), 
]