申请表格中至少两个字段之一

时间:2018-11-03 23:11:42

标签: django python-3.x django-models django-forms

我已经完成了一个模型,该模型具有emailphone字段,我只想将两者都设为必填项。换句话说,您只需要填写其中一个即可发送表格。

我试图这样做:

class ClientQueriesModel(models.Model):
    # [...]
    email = models.EmailField(max_length=100, null=True, blank=True)
    phone = models.CharField(max_length=100, null=True, blank=True)

class ClientQueriesModelForm(forms.ModelForm):
    class Meta:
        model = ClientQueriesModel
        fields = ['name', 'email', 'phone', 'subject', 'message']
    def clean(self):
        cleaned_data = super(ClientQueriesModelForm, self).clean()
        cc_myself = cleaned_data.get("email")
        subject = cleaned_data.get("phone")
        if not cc_myself and not subject:
            raise forms.ValidationError("At least one of both field must be completed: email or phone number.")

但是它不起作用。表单没有发送,但是用户没有看到任何错误消息,页面只是刷新(不发送表单,而是清理name字段)。

如何从两个字段中使一个成为必填项?

请注意,我使用的是自定义表单模板,因此,如果必须在HTML模板中执行任何编辑(我在Internet上找不到该模板),请告诉我。

PS::我正在使用Django 1.11。

编辑:

这是我的view

def about(request):
    if request.method == 'POST':
        form = ClientQueriesModelForm(request.POST)
        if form.is_valid():
            register = form.save()
            return base(request, 'about', make_form=False)
    else:
        form = ClientQueriesModelForm()
    return base(request, 'about', form=form, make_form=True)

base是我用来调用Django render并附带一些其他参数的函数:

def base(request, file, **kargs):        
    return render(request, f"vistaprevia/{file}.html", {"background_images": BACKGROUND_IMAGES, 'background_image': choice(BACKGROUND_IMAGES), **kargs})

我的表单模板是:

<form action="/about" method="post">
    {% csrf_token %}
    {{ form.non_field_errors }} <!--I found this on the internet, not exactly sure what it does-->
    <table class="query">
      <thead>
          <th>Parametro</th>
          <th>Datos</th>
      </thead>
      <tbody>
        <!--[...]-->
        <tr>
          <th>{{form.email.label_tag}}</th>
          <th>{{form.email.errors}}{{form.email}}</th>
        </tr>
        <tr>
          <th>{{form.phone.label_tag}}</th>
          <th>{{form.phone.errors}}{{form.phone}}</th>
        </tr>
        <!--[...]-->
      </tbody>
      <tfoot>
          <tr><th colspan="2"><input type="submit" value="Submit" /></th></tr>
      </tfoot>
    </table>
  </form>

1 个答案:

答案 0 :(得分:0)

由于form.non_field_errors是一个列表,我认为您应该遍历该列表并显示错误。

{% for err in form.non_field_errors %}
     {{err}}
{% endfor %}

您还说过at least one field应该是强制性的,但是您有:

if not cc_myself and not subject

这两个字段都必须填写。将and替换为or