Условно требуется только одно поле в форме модели Django - PullRequest
8 голосов
/ 28 января 2010

В любом случае, чтобы сделать поле условно обязательным на основании того, было ли заполнено другое поле в той же форме?

If field1 has no data, but field2 does
    form is valid.

If field1 has no data and field2 has no data
    form is invalid

Не ищу никаких решений для JavaScript. Я чувствую, что это должно быть решено с помощью форм django, но не совсем уверен, как лучше это сделать.

Ответы [ 3 ]

9 голосов
/ 28 января 2010

Переопределить метод .clean (self), проверить наличие self.cleaned_data и вызвать ValidationError

https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

6 голосов
/ 02 мая 2014

Вы также можете сделать это, используя модель, если знаете, что проверка будет применяться ко всем объектам этого класса. Чтобы использовать нижеследующее на уровне формы, используйте cleaned_data. Вот пример прямо из документации Django с использованием ValidationError:

class Article(models.Model):

    status = models.CharField(max_length=75, blank=False, null=False)
    pub_date = models.CharField(max_length=75, blank=False, null=False)

    def clean(self):
        # Don't allow draft entries to have a pub_date.
        if self.status == 'draft' and self.pub_date is not None:
            raise ValidationError('Draft entries may not have a publication date.')
        # Set the pub_date for published items if it hasn't been set already.
        if self.status == 'published' and self.pub_date is None:
            self.pub_date = datetime.date.today()

Ссылка: Модель Чистый экземпляр , Валидаторы Джанго

Вот пример формы:

class SimpleForm(forms.ModelForm):

    def clean(self):
        cleaned_data = super(SimpleForm, self).clean()  # Get the cleaned data from default clean, returns cleaned_data
        field1 = cleaned_data.get("field1")
        field2 = cleaned_data.get("field2"),

        if not field1 and not field2:
            raise forms.ValidationError('Please fill in both fields.')

        return cleaned_data

Ссылка: Проверка формы и поля

0 голосов
/ 31 марта 2016

Лучшее решение для условно обязательного поля - переопределить метод очистки формы и вызвать ошибку при условии. Например:

clean(self):
    if self.cleaned_data.get(some_field) == 1:
        self.errors.pop(other_field, None)
...