【发布时间】:2022-07-08 16:11:04
【问题描述】:
我在注册页面上有一个表单,需要输入日期以及其他一些字段。如果用户在日期字段(如字符串)中输入无效信息并提交表单,Django 将表单视为无效拒绝,但我没有在页面上收到任何错误消息 - 但对于其他字段表单,我确实收到错误消息(例如:密码不匹配、用户已注册等)。
表单如下所示: Link to image of registration form
这是我的 forms.py 文件 - 我使用两个类在注册页面上创建表单:
from django import forms
from users.models import Profile
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class CustomUserCreationForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta(UserCreationForm.Meta):
model = User
#fields = UserCreationForm.Meta.fields + ("email",)
fields = ['username', 'email', 'password1', 'password2']
class EmployeeForm(forms.ModelForm):
hireDate = forms.DateField(
required=False,
error_messages={'required': 'Please enter a valid date'},
input_formats=[
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y'
]) # '10/25/06')
class Meta:
model = Profile
fields = ['hireDate', 'employeeNumber']
这是 models.py 字段,其中包含配置文件的模型:
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
#confirmed = models.BooleanField("Confirmed", default=False)
hireDate = models.DateField(auto_now=False,
auto_now_add=False,
verbose_name='Date of Hire',
null=True)
employeeNumber = models.CharField(max_length=10,
verbose_name='Employee Number',
null=True)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
这是呈现表单的 views.py - 我将两种表单合二为一,并通过一个按钮/输入进行提交。问题似乎在于第二种形式(EmployeeForm),第一种形式(CustomUserCreationForm)似乎工作正常:
from django.contrib.auth import login
from django.shortcuts import redirect, render
from django.urls import reverse
from users.forms import CustomUserCreationForm, EmployeeForm
from users.models import User, Profile
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.contrib import messages #import messages
def dashboard(request):
return render(request, "users/dashboard.html")
#@login_required
# @transaction.atomic
def register(request):
if not request.user.is_authenticated:
if request.method == 'POST':
form = CustomUserCreationForm(
request.POST) #, instance=request.user)
e_form = EmployeeForm(
request.POST) #, instance=request.user.profile)
if form.is_valid() and e_form.is_valid():
user = form.save()
user.refresh_from_db(
) # load the profile instance created by the signal
e_form = EmployeeForm(request.POST, instance=user.profile)
e_form.full_clean()
e_form.save()
messages.success(request, f'Your account has been approved!')
return redirect('login')
else:
form = CustomUserCreationForm()
e_form = EmployeeForm()
print(form.errors)
print(e_form.errors)
context = {'form': form, 'e_form': e_form}
return render(request, 'users/register.html', context)
else:
return redirect('dashboard')
最后是 模板 上显示注册页面的表单的 html - 如您所见,我尝试了几种不同的方法来让表单显示错误消息,但它们都不适用于日期字段:
<form class="text-center" method="post">
{% csrf_token %}
<!--Username-->
<div class="mb-3"><input class="form-control" type="text" name="username" placeholder="Username" required id="{{ field.id_username }}"</div>
<div class="text-danger">
{% for error in form.username.errors %}{{ error }}<br/>{% endfor %}
</div>
<!--Email-->
<div class="mb-3"></div>
<div class="mb-3"><input class="form-control" type="email" name="email" placeholder="Email" required id="{{ field.id_email }}"</div>
<div class="text-danger">
<!-- {% for error in form.register.errors %}{{ error }}<br/>{% endfor %} -->
</div>
<!--Password-->
<div class="mb-3"></div>
<div class="mb-3"><input class="form-control" type="password" name="password1" autocomplete="password" required id="{{ field.id_password1 }}" placeholder="Password"></div>
<div class="text-danger">
{% for error in form.password1.errors %}{{ error }}<br/>{% endfor %}
</div>
<!--Password Confirm-->
<div class="mb-3"></div>
<div class="mb-3"><input class="form-control" type="password" name="password2" autocomplete="password" required id="{{ field.id_password2 }}" placeholder="Confirm Password"></div>
<div class="text-danger">
{% for error in form.password2.errors %}{{ error }}<br/>{% endfor %}
</div>
<!--Date of Hire -->
<div class="mb-3"></div>
<div class="mb-3"><input class="form-control" type="text" name="hireDate" autocomplete="Date of Hire" required id="{{ field.id_hireDate }}" placeholder="Date of Hire"></div>
<div class="text-danger">
{% for error in form.hireDate.errors %}{{ error }}<br/>{% endfor %}
</div>
<!-- Employee Number -->
<div class="mb-3"></div>
<div class="mb-3"><input class="form-control" type="text" name="employeeNumber" autocomplete="Employee Number" required id="{{ field.id_employeeNumber }}" placeholder="Employee Number"></div>
<div class="text-danger">
<!-- {% for error in form.register.errors %}{{ error }}<br/>{% endfor %}-->
</div>
{{ form.non_field_errors }}
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<p> {{ error }} </p>
{% endfor %}
{% endfor %}
{% endif %}
<input class="btn btn-primary d-block w-100" type="submit" value="Register">
<div class="mb-3"></div>
<a class="text-muted" href="{% url 'login' %}">Back to Login</a>
</form>
如果日期输入不正确,我不确定我还能做些什么来让表单向用户提供错误消息。
【问题讨论】:
-
更新:在日期字段的模板页面上,我将表单字段类型从“文本”更改为“日期” - 这解决了问题,因为它现在将该字段呈现为仅限日期格式的字段使用日期选择器 - 没有其他类型的输入是可能的。仍然会感谢任何其他 cmet 为什么它以前不起作用。
标签: python django django-models django-views django-templates