我有一个sidenav_form,它使用ajax post提交给一个名为form_validation的视图。空字段或无效电子邮件的验证错误将正确显示,因为当表单提交并传递到视图时,视图将呈现显示错误的表单。以下是控制台输出:
<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 1279sidenav_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视图检查表单是否正确。它看起来如下:
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您是否知道为什么与空字段相关的错误或无效的电子邮件会正确地呈现表单错误,但是重复的电子邮件重定向到另一个页面?
发布于 2020-02-12 11:19:28
实际上,问题的出现是因为调用ajax的按钮将属性type定义为submit。因此,当按下按钮时,它实际上产生了另一个post request,因此django开始同时处理两个请求。
https://stackoverflow.com/questions/60126827
复制相似问题