django表单日期输入字段未显示错误
我在注册页面上有一个表格,该表格需要输入日期以及其他一些字段。如果用户将非valid信息输入日期字段(如字符串)并提交表单,则Django将表单拒绝为非valid,但是我在页面上没有任何错误消息 - 但是对于其他字段表格,我确实会收到错误消息(例如:密码不匹配,用户已经注册等)。
这是表格的样子: 链接到注册形式的图像
这是我的 forms.py file - 我正在使用两个类在注册页面上创建表单:
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 呈现表单 - 我将两种形式组合成一个表格,并用一个按钮/输入提交。这个问题似乎在于第二种形式(员工形式),第一种表单(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')
最后,这是 template 上上呈现注册页面的html的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>
我不确定我还能做些什么来获取表格来提供错误消息如果不正确输入日期,则将其发送给用户。
I have a form on a registration page that requires a date to be entered, along with a few other fields. If the user enters non-valid information into the date field (like a string) and submits the form, Django rejects the form as non-valid, but I don't get any error messages on the page - But for the other fields on the form, I do get error messages (ex: Passwords Don't Match, User Already Registered, etc).
Here is what the form looks like:
Link to image of registration form
Here is my forms.py file - I'm using two classes to create the form on the registration page:
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']
Here is the models.py field with the model for the profile:
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()
And here is the views.py that presents the form - I'm combining two forms into one, and submitting with one button/input. The problem seems to lie with the second form (EmployeeForm), the first form (CustomUserCreationForm) seems to work fine:
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')
And finally here is the html for the form on the template that presents the registration page - as you can see, I've tried a few different ways to get the form to present error messages, but none of them are working for the date field:
<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>
I'm not sure what else I can do to get the Form to offer error message to the user if the date is entered incorrectly.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
通常,最好使用
type ='date'
而不是type ='text'
在输入中,但是如果您使用过的话,可以从文字也是如此。首先,
Hiredate
字段来自e_form
不是form 。尝试以下代码:
html文件:
forms.py:
现在,您将看到错误
输入有效的日期
error_messages = {'必需/code> to必需= false
没有道理。views.py可以保持不变。
Generally, it is better to use
type='date'
instead oftype='text'
in input, but if you have used so, you can do it its validation from text also.First thing the
hireDate
field is frome_form
not.form
Try below code:
html file:
forms.py:
Now, you will see the error
enter a valid date
and settingerror_messages={'required': 'Please enter a valid date'}
to arequired=False
makes no sense.The views.py can be remain same.