我已经完成了一个模型,该模型具有email
和phone
字段,我只想将两者都设为必填项。换句话说,您只需要填写其中一个即可发送表格。
我试图这样做:
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>
答案 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
。