Остановить отправку формы до проверки
У меня есть форма, структурированная следующим образом.
<form id="email_subscription_form" class="form-inline float-right" method="post" action="/my-endpoint/">
<div class="form-group">
<label for="id_email_address" class="d-none">Email Address</label>
<input type="email" id="id_email_address" class="form-control border-0 rounded-0" name="email_address" value="" placeholder="Email Address">
<input type="hidden" name="mailpiece_slug" value="{{ page.settings.email_newsletter_slug }}" />
<input type="hidden" name="event_slug" value="subscribe" />
</div>
</form>
Также у меня есть скрипт в нижней части файла. Смысл скрипта заключается в проверке recaptcha перед отправкой формы. Вот мой скрипт.
<script>
document.getElementById('email_subscription_form').addEventListener('submit', verifyRecaptcha);
function verifyRecaptcha(e) {
e.preventDefault()
return false
}
</script>
Я думал, основываясь на некоторых исследованиях, что функция, возвращающая false, остановит отправку формы. Однако форма все равно отправляется и попадает в конечную точку.
Я также пробовал следующее:
<form id="email_subscription_form" class="form-inline float-right" method="post" action="/my-endpoint/" onsubmit="return verifyRecaptcha()">
и
<form id="email_subscription_form" class="form-inline float-right" method="post" action="/my-endpoint/" onsbubmit="return false">
но форма все равно отправляется.
Что я могу сделать, чтобы форма не отправлялась до проверки? Это проект Django, поэтому шаблон - это шаблон Django.
Я провел некоторое исследование и в форме есть параметр onsubmit=""
, в который можно вписать вызов функции проверки, как это уже сделано в verifyRecaptcha(e)
. Насколько я могу судить, часть return false
должна остановить форму, возможно, это потому, что вы не используете onsubmit="verifyRecaptcha(e)"
в теге открытия формы. Поэтому прямой скрипт onload не работает. Ваш код должен выглядеть следующим образом:
html:
<form id="email_subscription_form" onsubmit="verifyRecaptcha(e) class="form-inline float-right" method="post" action="/my-endpoint/">
<div class="form-group">
<label for="id_email_address" class="d-none">Email Address</label>
<input type="email" id="id_email_address" class="form-control border-0 rounded-0" name="email_address" value="" placeholder="Email Address">
<input type="hidden" name="mailpiece_slug" value="{{ page.settings.email_newsletter_slug }}" />
<input type="hidden" name="event_slug" value="subscribe" />
</div>
</form>
js:
<script>
function verifyRecaptcha(e) {
e.preventDefault()
return false
}
</script>
Я настоятельно рекомендую вам изучить, как django может помочь вам с формами: работа с формами.
Встроенное в django управление формами уже имеет все необходимые функции, такие как валидация, и позволяет вам сосредоточиться на других вещах. Кроме того, вы все еще можете добавлять свой JS как обычно.
Смотрите вышеуказанную ссылку на документацию и следующий пример, чтобы получить некоторое представление:
from django import forms
from django.core.exceptions import ValidationError
class ContactForm(forms.Form):
# Everything as before.
...
def clean_recipients(self):
data = self.cleaned_data['recipients']
if "fred@example.com" not in data:
raise ValidationError("You have forgotten about Fred!")
# Always return a value to use as the new cleaned data, even if
# this method didn't change it.
return data
Это позволит проверить, есть ли в поле 'recipients' определенный email. Если нет, то возникает ошибка ValidationError с отображением объявленного текста под соответствующим полем в форме.