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

时间:2012-07-05 09:39:09

标签: django django-admin django-authentication

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

# 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>

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

6 个答案:

答案 0 :(得分:9)

HOLA
我找到了一个非常简单的解决方案 您只需要修改项目的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),
  5. 这是一个例子

    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)),
    ]
    

答案 1 :(得分:7)

AdminSite有一个login_form属性,可用于覆盖使用的表单。

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

全部都在documentation

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:1)

我知道这是一个老线程,但我想添加它帮助我找到的东西,以防它可以帮助别人。

我正在使用特殊的远程身份验证(Shibboleth)并且覆盖admin login_form是不够的。我有一个视图,它设置cookie并返回变量并重定向到远程身份验证提供程序等。

所以我这样做的方式是:

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

效果很好! 感谢@dgk

答案 4 :(得分:0)

也许使用templatetag获取自定义AuthenticationForm

答案 5 :(得分:0)

我重定向到唯一的登录网址(我使用的是django 2.1和python 3.6 f字符串):

from apps import admin
from django.urls import path, include
from django.shortcuts import redirect

urlpatterns = [
    path(
        'admin/login/',
        lambda r: redirect(
            f"/login?{r.META['QUERY_STRING']}" if r.META['QUERY_STRING'] \
            else '/login'
        )
    ),
    path('admin/', admin.site.urls),
]
相关问题