【问题标题】:Django - clean() with hidden formDjango - 具有隐藏形式的 clean()
【发布时间】:2017-05-16 04:58:37
【问题描述】:

我在这里遇到了问题,我的 def clean() 无法与隐藏的 form 一起使用。

我有三个forms,我使用jqueryselect 隐藏它,例如,如果我想要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 并选择form1 时我会看到该消息

我想在我点击我的submit时看到它...可以吗?

注意

这次我只有一个formform1,但我很快就会添加更多,这就是我使用selectJquery 的原因。

谢谢!!

编辑:

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)

我刚刚使用viewsform 编辑了我的代码。

一旦我转到我的表单并尝试注册一个已经存在的用户,我会收到错误消息,没关系。但是我之前解释了一个 Jquery 效果,它阻止我看到我的错误消息,除非我点击我的选择并选择我的表单,然后我可以看到我的标志错误Error, already exists

一旦我点击submit 并重定向我,我希望看到Error, already exists

clean() 方法仅在我选择 form 时有效

【问题讨论】:

  • 表单类中的清理方法不是创建模型实例的地方。
  • 您好,感谢您的回答。你建议我在哪里使用干净的方法?我试过 Views.py 但对我不起作用
  • 执行 form.is_valid() 时会自动调用 clean 方法。你为什么不编辑你的问题,包括你的观点、你的表格,并解释你想要实现的目标
  • 刚刚编辑了我的代码@e4c5

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


【解决方案1】:

答案是这里不需要重写clean方法because

ModelForm.clean() 方法设置一个标志,使模型 验证步骤验证模型字段的唯一性 标记为 unique、unique_together 或 unique_for_date|month|year。

如果你想重写 clean() 方法并维护它 验证,必须调用父类的 clean() 方法。

所以你需要的只是 forms.py

class userForm(forms.ModelForm):
    class Meta:
        model = user
        fields = ["name"]

就是这样!

【讨论】:

  • 对不起,我不明白你的意思。我不需要 clean() 方法?我想避免模板中的 jquery 选择和显示名称已存在错误
  • 这由 ModelForm 自动处理,如我的回答中所述。请参阅链接文档了解更多详情
  • 谢谢,我找到了我需要的东西。按预期工作!
  • 很高兴能帮上忙
猜你喜欢
  • 1970-01-01
  • 2020-11-16
  • 2017-01-28
  • 1970-01-01
  • 2016-03-25
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
相关资源
最近更新 更多