【发布时间】:2017-05-16 04:58:37
【问题描述】:
我在这里遇到了问题,我的 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 并选择form1 时我会看到该消息
我想在我点击我的submit时看到它...可以吗?
注意:
这次我只有一个form 和form1,但我很快就会添加更多,这就是我使用select 和Jquery 的原因。
谢谢!!
编辑:
forms.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)
Views.py
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 和form 编辑了我的代码。
一旦我转到我的表单并尝试注册一个已经存在的用户,我会收到错误消息,没关系。但是我之前解释了一个 Jquery 效果,它阻止我看到我的错误消息,除非我点击我的选择并选择我的表单,然后我可以看到我的标志错误Error, already exists
一旦我点击submit 并重定向我,我希望看到Error, already exists。
clean() 方法仅在我选择 form 时有效
【问题讨论】:
-
表单类中的清理方法不是创建模型实例的地方。
-
您好,感谢您的回答。你建议我在哪里使用干净的方法?我试过 Views.py 但对我不起作用
-
执行 form.is_valid() 时会自动调用 clean 方法。你为什么不编辑你的问题,包括你的观点、你的表格,并解释你想要实现的目标
-
刚刚编辑了我的代码@e4c5
标签: jquery python django django-models django-forms