我在这里遇到问题,我的def clean()
无法使用隐藏的form
。
我有三个forms
我在jquery
使用select
隐藏它,所以如果我想要form1
,我只需要选择form1
它会隐藏其他人2。
现在我尝试使用clean()
但是当我收到raise ValidationError
时,我无法看到它,因为我的form
被隐藏了。
所以我需要点击form1
,之后我会看到error
是否有可能查看我的error
,即使它隐藏了?
因为在我点击form1
之前,有时候我不知道为什么会收到错误。
我一直在寻找可能的解决方案而一无所获。
模板
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.1.min.js"></script>
{{ titulo }}
<hr/>
<br/>
{% if messages %}
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
{% for message in messages %}
{% if message.tags %}<div class="alert alert-{{ message.tags }}">{{ message }}</div>{% endif %}
{% endfor %}
</div>
{% endif %}
<center>
<label for="protocolo">Protocolo de Activos</label>
<select id="protocolo" name="protocolo">
{% for x,y in form.fields.protocolo.choices %}
<option value="{{ x }}"{% if form.fields.protocolo.value == x %} selected{% endif %}>{{ y }}</option>
{% endfor %}
</select>
</center>
<br>
<div id="form1" style="display:none;">
<form method="POST" action="">{% csrf_token %}
{{ form1.as_p }}
<input type="submit" value="Enviar Datos" />
</form>
</div>
<script>
$('#protocolo').on('change',function(){
var selection = $(this).val();
switch(selection){
case "form1":
$("#form1").show()
break;
default:
$("#form1").hide()
}
});
</script>
正如您所看到的,我使用jquery
来show()
和hide()
form1
。
如果name
存在,此代码正常工作我将获得Error
但是当我点击select
并选择{{1}时,我会看到该消息}}
我希望在我点击form1
时看到它...是否可能?
注意:
这次我只有一个submit
作为form
但我必须尽快添加更多内容,这就是我使用form1
的原因与select
。
谢谢!
修改
forms.py
Jquery
Views.py
class userForm(forms.ModelForm):
class Meta:
model = user
fields = ["name"]
def clean(self, *args, **kwargs):
try:
name = self.cleaned_data.get('name')
name,created = user.get_or_create(name=name)
except Exception, e:
raise ValidationError('Error, already exists')
return super(userForm, self).clean(*args, **kwargs)
我刚刚使用def user_form(request):
titulo = "Activos"
form1 = userForm(request.POST or None)
queryset = user.objects.all()
context = {
"form1": form,
"queryset": queryset,
}
if form1.is_valid():
instance = form.save()
messages.success(request, 'Has been added')
return redirect('/')
return render(request, "user.html", context)
和views
编辑了我的代码。
一旦我转到我的表单并尝试注册已存在的用户,我会收到错误消息,这没关系。但我之前解释了一个Jquery效果阻止我看到我的错误消息,除非我点击我的选择并选择我的表单,然后我可以看到我的标志错误form
一旦我点击Error, already exists
并重定向我,我希望看到Error, already exists
。
submit
方法仅在我选择clean()
答案 0 :(得分:2)
答案是,您不需要在此处覆盖干净方法because
ModelForm.clean()方法设置一个生成模型的标志 验证步骤验证模型字段的唯一性 标记为唯一,unique_together或unique_for_date | month | year。
如果要覆盖clean()方法并维护它 验证时,必须调用父类的clean()方法。
所以你需要的是 forms.py
class userForm(forms.ModelForm):
class Meta:
model = user
fields = ["name"]
那就是它!