Я сделал модель с полями 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 (которого я не нашел в Интернете), сообщите мне.
P.S .: Я использую Django 1.11.
Edit:
Это мой 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>