Поле ввода даты в форме Django не показывает ошибок
У меня есть форма на странице регистрации, которая требует ввода даты, а также нескольких других полей. Если пользователь вводит невалидную информацию в поле даты (например, строку) и отправляет форму, Django отклоняет форму как невалидную, но я не получаю никаких сообщений об ошибках на странице - Но для других полей формы я получаю сообщения об ошибках (например: Passwords Don't Match, User Already Registered, etc).
Вот как выглядит форма: Ссылка на изображение регистрационной формы
Вот мой файл 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.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 для формы на шаблоне , который представляет страницу регистрации - как вы можете видеть, я пробовал несколько различных способов заставить форму выдавать сообщения об ошибках, но ни один из них не работает для поля даты:
Я не уверен, что еще можно сделать, чтобы форма выдавала пользователю сообщение об ошибке, если дата введена неверно.
Спасибо за любую помощь, которую вы можете предложить.
Обычно лучше использовать type='date'
вместо type='text'
во вводе, но если вы использовали это, вы можете сделать его валидацию из текста также.
Во-первых, поле hireDate
находится в поле e_form
, а не form
.
Попробуйте следующий код:
html файл:
<!--Date of Hire -->
<div class="mb-3"></div>
<div class="mb-3">
{{e_form.hireDate}}
<div class="text-danger">
{% for error in e_form.hireDate.errors %}{{ error }}<br/>{% endfor %}
</div>
forms.py
class EmployeeForm(forms.ModelForm):
hireDate = forms.DateField(
required=False,
widget=forms.DateInput(
attrs={'class': 'form-control', 'placeholder': 'Enter 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']
Теперь вы увидите ошибку enter a valid date
, а установка error_messages={'required': 'Please enter a valid date'}
на required=False
не имеет смысла.
views.py может остаться прежним.