Валидация формы 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>