【发布时间】:2020-05-24 09:07:06
【问题描述】:
我有一个sidenav_form,它使用 ajax 帖子提交到名为form_validation 的视图。 empty fields 或 invalid email 的验证错误会正确显示,因为当表单提交并传递给视图时,视图会呈现显示错误的表单。这是控制台输出:
<ul class="errorlist"><li>email<ul class="errorlist"><li>Required Field</li></ul></li></ul>
[08/Feb/2020 13:26:37] "POST /patients/validate_form/ HTTP/1.1" 200 1253
但是,通过 重复电子邮件 的验证器时的行为是不同的。错误像以前一样发送到请求,但用户看不到它,因为请求似乎重定向到另一个视图......
<ul class="errorlist"><li>email<ul class="errorlist"><li>This email has already been taken.</li></ul></li></ul>
[08/Feb/2020 13:26:40] "POST /patient/ HTTP/1.1" 200 7769
[08/Feb/2020 13:26:40] "POST /patients/validate_form/ HTTP/1.1" 200 1279
sidenav_form.html 如下:
{% load i18n %}
{% load crispy_forms_tags %}
<!-- sideNav -->
<div class="inside_sidenav">
<form class="form" id="form_patient">
{% csrf_token %}
{{ form.as_p}}
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary" id="sidenav-btn-submit" formmethod="post">{% trans 'Guardar'%}
</button>
</div>
</form>
</div>
</div>
<script>
$(function () {
// SUBMIT DATA
$('#sidenav-btn-submit').click(function () {
console.log('noinstance')
var url = "{% url 'patients:validate_form' %}";
var formb = $('#form_patient');
console.log(formb.serialize());
$.ajax({
url: url,
data: formb.serialize(),
type: "POST",
headers: { "X-CSRFToken": '{{ csrf_token }}' },
dataType: 'json',
success: function (data) {
$('#mySidenav').html(data);
openNav();
},
error: function (data) {
$('#mySidenav').html(data.responseText);
console.log('no ajax2');
},
});
});
});
</script>
form_validation view 检查表单是否正确。它看起来如下:
def validate_form(request, patient_id=None, user_id=None):
form_initial_data = request.POST
if request.method == 'POST':
print(form_initial_data)
form = UserForm(form_initial_data)
if form.is_valid():
print('Form2 is valid')
# DO SOMETHING
print(form.errors)
return render(request, 'patients/sidenav_form.html', {'form1': form})
form 具有以下验证器:
def clean_email(self):
email = self.cleaned_data["email"]
if not self.instance.pk:
try:
User.objects.get(email=email)
except User.DoesNotExist:
return email
print('Repeated email')
raise ValidationError(_("This email has already been taken."))
return email
您知道为什么与 空字段 或 无效电子邮件 相关的错误会正确呈现表单错误,但 repeated email 会重定向到另一个页面?
【问题讨论】: