无法将自定义AuthenticationForm与LoginView一起使用

时间:2019-03-01 13:07:32

标签: django django-forms django-views

尝试将Bootstrap CSS类添加到AuthenticationForm,但是将authentication_form添加到urls.py时,没有任何变化?它会找到模板,并且可以使用自定义用户模型登录。

urls.py

from django.urls import path
from user.forms import AuthForm
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('auth/', auth_views.LoginView.as_view(
        authentication_form=AuthForm,
        template_name='user/login.html',), name='login'),
]

forms.py

from django import forms
from django.contrib.auth.forms import AuthenticationForm
from django.forms.widgets import PasswordInput, EmailInput


class AuthForm(AuthenticationForm):
    class Meta:
        widgets = {
            'username':forms.EmailInput(attrs={'class':'form-control form-control-sm'}),
            'password':forms.PasswordInput(attrs={'class':'form-control form-control-sm'}),
        }
# I have also tried
        username = forms.CharField(widget=forms.EmailInput(attrs={'class':'form-control form-control-sm'}))
        password = forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control form-control-sm'}))

我看不出有什么问题吗?没有错误消息或任何东西,我可以登录,只是LoginView根本不使用AuthForm。这是Django 2.1.7。

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:0)

我建议您阅读有关customizing authentication的django官方文档。

首先,您可以为用户模型创建自定义模型。

$ python manage.py startapp customuser

在customuser / models.py文件中,创建一个名为 User

的新模型。
from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser, PermissionsMixin
)


class UserManager(BaseUserManager):
    def create_user(self, email, full_name, password=None):
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
            full_name=full_name
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, full_name, password):
        user = self.create_user(
            email,
            full_name=full_name,
            password=password,
        )
        user.is_superuser = True
        user.is_admin = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    full_name = models.CharField(
        verbose_name='full name',
        max_length=128
    )
    profile_image = models.ImageField(
        null=True,
        blank=True,
        upload_to='profile_images/')
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['full_name']

    def __str__(self):
        return self.email

    @property
    def is_staff(self):
        return self.is_admin

在settings.py文件中更新INSTALLED_APPS并更改AUTH_USER_MODEL变量

INSTALLED_APPS = [
    ...,
    customuser,
]

...

AUTH_USER_MODEL = 'customuser.User'

之后,您已经可以使用电子邮件登录

答案 1 :(得分:0)

这是我的模板login.html的内容,我已经在您的测试应用程序中实现了您的代码,并且效果很好。

在您的应用中,添加 templates 文件夹,在其内部创建login.html文件并添加此代码。

{% extends 'base.html' %}


{% block content %}
    <form class="" action="{% url 'login' %}" method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit" name="" value="Send">
    </form>
{% endblock %}