Запрос хотя бы одного из двух полей в форме - PullRequest
0 голосов
/ 04 ноября 2018

Я сделал модель с полями 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>

1 Ответ

0 голосов
/ 04 ноября 2018

Поскольку 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...