Django - 带隐藏形式的清洁()

时间:2017-01-02 02:48:10

标签: jquery python django django-models django-forms

我在这里遇到问题,我的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>

正如您所看到的,我使用jqueryshow()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()

时才有效

1 个答案:

答案 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"]

那就是它!