覆盖 Django 的 AuthenticationForm 字段

Override Django's AuthenticationForm's fields

我正在使用 Django 的身份验证后端并且工作正常,但我想为用户名和密码字段提供自定义 CSS class。我一直在尝试寻找解决方案,但在这里或其他任何地方都找不到任何东西。这是我到目前为止所做的:

project/forms.py:

from django import forms
from django.contrib.auth.forms import AuthenticationForm

class LoginForm(AuthenticationForm):
    username = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control form-control-lg'}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control form-control-lg'}))

project/urls.py:

from django.contrib import admin
from django.urls import path, include
from .forms import LoginForm

urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls'), {'authentication_form': LoginForm}),
]

accounts/login.html:

<form method="POST">
    {% csrf_token %}
    <div class="form-group">
        {{ form.username }}
        {{ form.password }}
    <button type="submit" class="btn btn-primary btn-lg btn-block">Sign in</button>
</form>

登录系统可以正常工作,但我无法显示 CSS 更改。我检查了用户名和密码字段,但它们根本没有显示在浏览器中。我猜我在某处遗漏了什么?

不确定如何直接执行此操作,但我使用 widget-tweaks 来执行此操作,并且效果很好(还执行所有错误通知)。您不需要在表单中设置任何内容,一切都在模板中完成。模板中的行将是:

    {% with "form-control input-field-"|add:form.username.name as field_class %}{% render_field form.username class=field_class %}{% endwith %}

这将为每个输入字段提供一个单独的 class。看看 https://github.com/jazzband/django-widget-tweaks.

它不起作用的原因是因为您添加的 {'authentication_form': LoginForm} 的路径中包含 include(....),这是不可能的,您需要仅将其传递给登录名 url(或您覆盖该表单的登录名):

from django.contrib.auth.views import LoginView

urlpatterns = [
    path('accounts/login/', LoginView.as_view(authentication_form=LoginForm)),
    path('accounts/', include('django.contrib.auth.urls')),
]