Валидация формы Django проверяет только частичную проверку перед отправкой/постом

У меня есть форма регистрации клиента в модале bootstrap, по этой причине я хотел бы сделать некоторую базовую валидацию перед размещением.

На данный момент, если вы оставляете поле пустым, если строка слишком длинная или если в электронном письме нет символа @, появляется предупреждение, что идеально. Но, несовпадающие пароли, недействительные адреса электронной почты, такие как example@example. Уверен, что это должно провалить ValidateEmail regex?

Ошибки валидации прекрасно подхватываются в просмотрах после отправки, но возврат к модалу - это проблема, поэтому я хотел бы, чтобы они подхватывались той же валидацией перед отправкой, которая подхватывает пустые поля.

Или, если это не удастся, возможно ли сделать Ajax-запрос на View и обновить форму асинхронно? Получение формы в json было бы не очень весело. Или мне просто отказаться от django и использовать jquery validation?

Формы:

class CreateRegistrationForm(UserCreationForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for f in self.fields:
            self.fields[f].widget.attrs['class'] = 'form-control'

    class Meta:
        model = User
        fields = ["email", "password1", "password2", "first_name", "last_name"]

Модели:

class User(AbstractBaseUser, PermissionsMixin):

    class Types(models.TextChoices):
        CUSTOMER = "CUSTOMER", "Customer"
        STAFF = "STAFF", "Staff"

    base_type = Types.CUSTOMER

    type = models.CharField(
        _("Type"), max_length=50, choices=Types.choices, default=base_type
    )

    user_name = models.CharField(max_length=150)
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=150)
    email = models.EmailField(max_length=150, unique=True)
    creation_date = models.DateTimeField(default=timezone.now)
    address = models.CharField(max_length=300, blank=True)
    phone_number = PhoneNumberField(null=False, blank=True)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["first_name", "last_name", "password1", "password2"]

    # rest omitted for brevity

Поскольку форма доступна из заголовка на любой странице, я использую контекстный процессор:

def registration_form(request):
    return {"reg_form": CreateRegistrationForm()}

Просмотров:

def register(request):
    if request.method == "POST":
        reg_form = CreateRegistrationForm(request.POST)
        if not reg_form.is_valid():
            for e, y in reg_form.errors.items():
                print("invalid", e, y)
            return HttpResponse({"reg_form": reg_form})
        print(reg_form.cleaned_data, reg_form.cleaned_data.get('user_name'))
    
    # rest omitted for brevity

HTML:

<div class="form-floating mb-3">
    {{ reg_form.email }}
    <label for="inputEmail2" class="form-label">Email address</label>
</div>
Вернуться на верх