11

我目前正在尝试在登录到管理站点时覆盖 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 喜欢向这个模板提供它自己的表单,因此只有usernamepassword字段渲染。有什么办法可以使这项工作,还是我最好将HTML字段“硬编码”到表单中?

4

6 回答 6

18

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

  1. 在您的项目文件夹中找到文件 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)),
]
于 2015-09-12T13:38:05.467 回答
12

AdminSite有一个login_form属性,您可以使用它来覆盖所使用的表单。

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

这一切都在文档中。

于 2012-07-05T15:13:23.383 回答
9

This code in urls.py works fine for me (Django version 1.5.1):

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

admin.autodiscover()
admin.site.login_form = AuthenticationForm
于 2013-08-11T13:00:26.620 回答
1

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

我正在使用特殊的远程身份验证(Shibboleth)并覆盖管理员 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

于 2015-03-10T13:26:47.903 回答
0

也许使用模板标签来获取您的自定义AuthenticationForm

于 2012-07-05T11:58:59.000 回答
0

我重定向到一个唯一的登录网址(我正在使用 django 2.1 和 python 3.6 f-strings):

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),
]
于 2020-06-16T07:37:32.117 回答