Django 表单在基于 class 的视图中无效

Django form is not valid in class based view

我目前正在开发一个博客项目,我在其中创建了一个自定义用户模型,我打算在其中根据该自定义用户模型创建注册表单。我的注册表单继承自 Django 中的 UserCreationForm。表单在我的模板中正确呈现,但每当我尝试注册用户时,表单都无效。我不确定我做错了什么。我期待着从你们这些聪明的人那里得到一些帮助! :-)

查看下面的相关用法:

models.py

from django.contrib.auth import get_user_model
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from .managers import CustomUserManager

class CustomUser(AbstractBaseUser, PermissionsMixin):
    first_name = models.CharField(max_length=255, null=True, blank=True)
    last_name = models.CharField(max_length=255, null=True, blank=True)
    username = models.CharField(max_length=200, unique=True)
    email = models.EmailField(_('email address'), max_length=150, unique=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now=True)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    objects = CustomUserManager()
    USERNAME_FIELD = 'email'  
    REQUIRED_FIELDS = ['username', ] 

    class Meta:
        ordering = ['-date_joined', 'username', 'email']
        verbose_name = 'User'
        verbose_name_plural = 'Users'

    def __str__(self):
        return self.username.title()

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model

class RegistrationForm(UserCreationForm):
    # confirm_password = forms.CharField(widget=forms.PasswordInput(attrs=registration_form_fields['confirm_password']))

    class Meta:
        model = get_user_model()
        fields = ['first_name', 'last_name', 'username', 'email', 'password']
        widgets = {
            'first_name': forms.TextInput(attrs=registration_form_fields['first_name']),
            'last_name': forms.TextInput(attrs=registration_form_fields['last_name']),
            'username': forms.TextInput(attrs=registration_form_fields['username']),
            'email': forms.EmailInput(attrs=registration_form_fields['email']),
            'password': forms.PasswordInput(attrs=registration_form_fields['new_password']),
        }

views.py

from django.contrib import messages
from django.views.generic import CreateView, TemplateView, FormView
from django.contrib.auth import logout, login, get_user_model, authenticate
from django.shortcuts import render, redirect


class RegistrationView(CreateView):
    model = get_user_model()
    template_name = 'users/register.html'
    form_class = RegistrationForm

    def get_context_data(self, **kwargs):
        context = super(RegistrationView, self).get_context_data(**kwargs)

        context['registration'] = True

        return context

    def post(self, request, **kwargs):
        registration_form = self.form_class(request.POST)

        print(request.POST.get('first_name'))
        print(request.POST.get('last_name'))
        print(request.POST.get('username'))
        print(request.POST.get('email'))
        print(request.POST.get('password'))
        # print(request.POST.get('confirm_password'))

        if registration_form.is_valid():
            print('Form is valid')
            # new_user = registration_form.save(commit=False)
            # new_user.save()

            # messages.success(request, f"User created successfully")
        else:
            print('Form is not valid') # It keeps printing this line...


        context = {
            'form': self.form_class(),
        }

        return render(request, self.template_name, context)

register.html

<!-- Registration Form -->

<form method='POST'>
    {% csrf_token %}

    <div class='ur-form-row'>
         <div class="ur-form-grid ur-grid-1" style="width:99%">

             <!-- Firstname field -->
             <div data-field-id="first_name" class="ur-field-item field-first_name ">
                 <div class="form-row " id="first_name_field" data-priority="">
                     <label for="first_name" class="ur-label">{{ form.first_name.label }} <abbr class="required" title="required">*</abbr></label>
                     {{ form.first_name }}
                 </div>
             </div>

             <!-- Lastname field -->
             <div data-field-id="last_name" class="ur-field-item field-last_name ">
                 <div class="form-row " id="last_name_field" data-priority="">
                     <label for="last_name" class="ur-label">{{ form.last_name.label }} <abbr class="required" title="required">*</abbr></label>
                     {{ form.last_name }}
                 </div>
             </div>

             <!-- Username field -->
             <div data-field-id="username" class="ur-field-item field-user_login ">
                 <div class="form-row " id="user_login_field" data-priority="">
                     <label for="username" class="ur-label">{{ form.username.label }} <abbr class="required" title="required">*</abbr></label>
                     {{ form.username }}
                 </div>
             </div>

             <!-- Email field -->
             <div data-field-id="email" class="ur-field-item field-user_email ">
                 <div class="form-row validate-required" id="user_email_field" data-priority="">
                     <label for="email" class="ur-label">{{ form.email.label }} <abbr class="required" title="required">*</abbr></label>
                     {{ form.email }}
                 </div>
            </div>

            <!-- Password field -->
            <div data-field-id="new_password" class="ur-field-item field-user_pass ">
                <div class="form-row validate-required hide_show_password" id="user_pass_field" data-priority="">
                    <label for="new_password" class="ur-label">{{ form.password.label }} <abbr class="required" title="required">*</abbr></label>
                    <span class="password-input-group">
                        {{ form.password }}
                    </span>
                </div>
           </div>

           <!-- Submit button -->
           <div class="ur-button-container ">
               <button type="submit" id="login-btn">Register!</button>
           </div>

       </div>
   </div>
</form>

请注意,每当我尝试提交表单时,它实际上会打印 request.POST.get('first_name') 和其他字段,并且我在控制台中看到提交的值,但表单本身仍然无效,所以我不明白。请帮忙...

所以我做错的是,我使用了 password 而不是 password1password2 因为根据从 [=15= 收到的消息,这两个是必需的].在 forms.py 文件中更新我的表单后,该表单现在声明它是有效的。

更新:

forms.py

class RegistrationForm(UserCreationForm):

    class Meta:
        model = get_user_model()
        fields = ['first_name', 'last_name', 'username', 'email', 'password1', 'password2']
        widgets = {
            'first_name': forms.TextInput(attrs=registration_form_fields['first_name']),
            'last_name': forms.TextInput(attrs=registration_form_fields['last_name']),
            'username': forms.TextInput(attrs=registration_form_fields['username']),
            'email': forms.EmailInput(attrs=registration_form_fields['email']),
            'password1': forms.PasswordInput(attrs=registration_form_fields['new_password']),
            'password2': forms.PasswordInput(attrs=registration_form_fields['confirm_password']),
        }

register.html

<!-- Registration Form -->

<form method='POST'>
    {% csrf_token %}

    <div class='ur-form-row'>
         <div class="ur-form-grid ur-grid-1" style="width:99%">

             <!-- Firstname field -->
             <div data-field-id="first_name" class="ur-field-item field-first_name ">
                 <div class="form-row " id="first_name_field" data-priority="">
                     <label for="first_name" class="ur-label">{{ form.first_name.label }} <abbr class="required" title="required">*</abbr></label>
                     {{ form.first_name }}
                 </div>
             </div>

             <!-- Lastname field -->
             <div data-field-id="last_name" class="ur-field-item field-last_name ">
                 <div class="form-row " id="last_name_field" data-priority="">
                     <label for="last_name" class="ur-label">{{ form.last_name.label }} <abbr class="required" title="required">*</abbr></label>
                     {{ form.last_name }}
                 </div>
             </div>

             <!-- Username field -->
             <div data-field-id="username" class="ur-field-item field-user_login ">
                 <div class="form-row " id="user_login_field" data-priority="">
                     <label for="username" class="ur-label">{{ form.username.label }} <abbr class="required" title="required">*</abbr></label>
                     {{ form.username }}
                 </div>
             </div>

             <!-- Email field -->
             <div data-field-id="email" class="ur-field-item field-user_email ">
                 <div class="form-row validate-required" id="user_email_field" data-priority="">
                     <label for="email" class="ur-label">{{ form.email.label }} <abbr class="required" title="required">*</abbr></label>
                     {{ form.email }}
                 </div>
            </div>

            <!-- Password1 field -->
            <div data-field-id="new_password" class="ur-field-item field-user_pass ">
                <div class="form-row validate-required hide_show_password" id="user_pass_field" data-priority="">
                    <label for="new_password" class="ur-label">{{ form.password.label }} <abbr class="required" title="required">*</abbr></label>
                    <span class="password-input-group">
                        {{ form.password }}
                    </span>
                </div>
           </div>

           <!-- Password2 field -->
           <div data-field-id="confirm_password" data-class="ur-field-item field-user_pass ">
               <div class="form-row validate-required hide_show_password" id="user_pass_field" data-priority="">
                   <label for="confirm_password" class="ur-label">{{ form.password2.label }} <abbr class="required" title="required">*</abbr></label>
                   <span class="password-input-group">
                       {{ form.password2 }}
                   </span>
               </div>
           </div>

           <!-- Submit button -->
           <div class="ur-button-container ">
               <button type="submit" id="login-btn">Register!</button>
           </div>

       </div>
   </div>
</form>