Django 管理员登录表单

Django Admin Login Form

如何更改 django admin 使用的登录表单(要添加验证码字段)?我正在使用 cookiecutter 模板并遵循了其他 SO 答案和指南中的建议:

forms.py

class AuthAdminForm(AuthenticationForm):
    captcha = ReCaptchaField(widget=ReCaptchaV3)
    show_something_different = forms.TextInput()

    class Meta(AuthenticationForm):
        fields = ('email', 'password', 'show_something_different', 'captcha')   

urls.py

from django.contrib import admin
from myapp.forms import AuthAdminForm
admin.autodiscover()
admin.site.login_form = AuthAdminForm
admin.site.login_template = 'admin/login.html'
urlpatterns = [
    # Django Admin, use {% url 'admin:index' %}
   path(settings.ADMIN_URL, admin.site.urls),
   ...]

我能够将 admin/login.html 添加到我的模板目录并扩展它。这可以将 google js 添加到 header(可以在源代码中看到)。但是验证码字段和我的虚拟额外字段没有显示。

我走在正确的轨道上,但让我吃惊的是 login.html 模板并没有呈现表单中存在的每个字段(这就是为什么我的虚拟测试字段从未出现过)。因此,我没有扩展 login.html,而是将整个内容复制到我自己的 templates/admin/login.html 文件中,然后手动添加了验证码字段:

<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
  <div class="form-row">
    {{ form.captcha }}
    {{ form.username.errors }}
    {{ form.username.label_tag }} {{ form.username }}
  </div>

base.html 可以这样扩展:

{% block extrahead %}
    <script async src="https://www.googletagmanager.com/gtag/js?id=G-xxx"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'G-xxx');
    </script>
{% endblock %}

现在,验证码终于出现在我的管理员登录页面上了。