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
而不是 password1
和 password2
因为根据从 [=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>
我目前正在开发一个博客项目,我在其中创建了一个自定义用户模型,我打算在其中根据该自定义用户模型创建注册表单。我的注册表单继承自 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
而不是 password1
和 password2
因为根据从 [=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>