Поле ввода даты в форме 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 может остаться прежним.

Вернуться на верх