Django - 覆盖管理站点的登录表单

TC *_*Fox 5 django django-admin django-authentication

我正在尝试在登录管理站点时覆盖Django 1.4中使用的默认表单(我的站点使用了选择双因素身份验证的用户所需的额外"令牌"字段,并且对于站点人员是必需的).Django的默认格式不支持我需要的内容.目前,我的templates/目录中有一个名为的文件templates/admin/login.html,它似乎正确地覆盖了我在我网站其余部分使用的模板.该文件的内容如下:

# admin/login.html:
{% extends "login.html" %}
Run Code Online (Sandbox Code Playgroud)

实际登录表格如下:

# 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>
Run Code Online (Sandbox Code Playgroud)

我的问题是,当使用我的普通登录URL访问时,提供的表单完全正常,因为我提供了自己AuthenticationForm作为要显示的表单,但是通过Django Admin登录路径,Django喜欢将它自己的表单提供给此模板,因此只有usernamepassword字段呈现.有什么方法可以让我的工作,或者这是我更好的'硬编码'HTML字段到表单?

ePi*_*314 11

Holá
我找到了一个非常简单的解决方案.
您只需要修改项目的urls.py文件(注意,而不是应用程序)

  1. 在PROJECT文件夹中找到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)),
]
Run Code Online (Sandbox Code Playgroud)


Chr*_*att 7

AdminSite有一个login_form属性,您可以使用该属性覆盖使用的表单.

子类AdminSite,然后使用您的子类的实例,而不是django.contrib.admin.site在管理员,urls.py等中注册您的模型.

一切都在文档中.


小智 6

这段代码urls.py对我来说很好(Django 1.5.1版):

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

admin.autodiscover()
admin.site.login_form = AuthenticationForm
Run Code Online (Sandbox Code Playgroud)