Django: сделать определенные поля в ModelForm обязательными = False

Как сделать определенные поля в ModelForm обязательными = False?

Если у меня есть:

class ThatForm(ModelForm):
  class Meta:
    widgets = {"text": Textarea(required=False)}

Или если у меня есть:

class ThatForm(ModelForm):
  text = Textarea(required=False)

Джанго возвращается:

__init__() got an unexpected keyword argument 'required'

person Synthead    schedule 04.06.2014    source источник
comment
Нет типа поля формы с именем TextArea, вы должны использовать предка Field, вероятно, тот, который называется CharField, и добавить виджет TextArea   -  person yedpodtrzitko    schedule 04.06.2014
comment
Можно ли установить для поля значение required=False без определения статического поля и/или типа виджета?   -  person Synthead    schedule 04.06.2014
comment
возможный дубликат обязательного поля Django в форме модели   -  person Vanni Totaro    schedule 06.08.2015


Ответы (5)


следует из комментариев. Вероятно, да:

class ThatForm(ModelForm):
    def __init__(self, *args, **kwargs):
        # first call parent's constructor
        super(ThatForm, self).__init__(*args, **kwargs)
        # there's a `fields` property now
        self.fields['desired_field_name'].required = False
person yedpodtrzitko    schedule 04.06.2014
comment
@User Я не знаю, но, возможно, официальные документы Django могли бы иметь: docs.djangoproject. com/en/2.1/ref/forms/fields - person yedpodtrzitko; 21.10.2018

вы должны добавить blank=True к соответствующей модели

В документации говорится

Если поле модели имеет пустое значение = True, то для поля формы required установлено значение False. В противном случае требуется = Истина.

Также см. документацию для самого бланка.

person rioted    schedule 03.07.2015
comment
Это должен быть принятый ответ, поскольку именно для этого предназначен blank - person dnaranjo; 29.06.2016
comment
Это не всегда решение: представьте, что у вас есть поле в модели, которое является обязательным, но вы хотите искать объекты этого типа с этим ограничением или без него. Затем вы хотите, чтобы форма разрешала поиск без этого атрибута. Например, у вас есть цвет в качестве обязательного поля в модели, но вы можете искать объекты, которые имеют определенную форму, независимо от цвета. - person Jens-Erik Weber; 26.09.2016
comment
Нет решения всегда решение. Но решение, которое я представил, является лучшей практикой, которую следует использовать, если только ваша ситуация не является необычной (например, та, которую вы упомянули). В этом случае будет иметь смысл отдельный вопрос SO. Но OP не упоминает о такой ситуации, вопрос очень общий, и поэтому должен быть ответ. - person rioted; 04.10.2016
comment
Нет, это специальное решение. Очень часто у вас есть модель с некоторыми обязательными полями, например. грамм. адреса с улицей, городом, страной - все обязательно, но вы хотите искать с помощью формы (ModelForm) только часть полей, например. грамм. только город и страна. И я так понял ОП. Ваше решение, которое для меня очень очевидно, что вы определяете поля модели как пустые = True (иногда в сочетании с null = True), работает только в особых случаях. Общий ответ принадлежит yedpodtrzitko. - person Jens-Erik Weber; 09.02.2017

Когда нам нужно установить требуемую опцию для группы полей, мы можем:

class ThatForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        for field in self.Meta.required:
            self.fields[field].required = True

    class Meta:
        model = User
        fields = (
            'email',
            'first_name',
            'last_name',
            'address',
            'postcode',
            'city',
            'state',
            'country',
            'company',
            'tax_id',
            'website',
            'service_notifications',
        )
        required = (
            'email',
            'first_name',
            'last_name',
            'address',
            'postcode',
            'city',
            'country',
        )
person Valery Ramusik    schedule 28.08.2018
comment
Все работает как шарм. @SandeepBalagopal, не могли бы вы объяснить, что именно пошло не так, и показать ошибку? - person Valery Ramusik; 08.05.2019
comment
попробовал это, и поля не стали обязательными. Если вы посмотрите на параметры в modelform, в modelform нет такой опции github.com/django/django/blob/master/django/forms/ - person Sandeep Balagopal; 09.05.2019
comment
@SandeepBalagopal, вы хотите сказать, что люди голосовали здесь stackoverflow.com/a/24045492/5992385 и здесь stackoverflow.com/a/1429646/5992385 неверны - person Valery Ramusik; 10.05.2019
comment
Я не заметил метод инициализации, который вы переопределили. Оно работает. Извините за путаницу. - person Sandeep Balagopal; 13.05.2019
comment
Кто-нибудь знает, почему это не стандартная спецификация ModelForms? - person Namgyu Ho; 13.03.2020
comment
Отличное решение. Однако я считаю, что все поля в ModelForm являются обязательными по умолчанию, поэтому не будет ли излишним делать несколько выбранных обязательных в конструкторе полей? Что нужно, так это выбрать необязательные и установить для них значение required = False (оставив остальные в состоянии по умолчанию True). - person isilanes; 14.07.2020
comment
@isilanes Вам грустно, я считаю, что все поля в ModelForm обязательны по умолчанию. Но не все. Поле погоды является обязательным для ModelForm, зависит от параметров поля в его модели. И иногда нам нужно переопределить такое поведение, сделав необязательные поля обязательными. - person Valery Ramusik; 15.07.2020

следующее может подойти

class ThatForm(ModelForm):
    text = forms.CharField(required=False, widget=forms.Textarea)
person quin    schedule 04.06.2014

Вы можете попробовать это:

class ThatForm(ModelForm):
  class Meta:
    requireds = 
    {
       'text':False,
    }

required должен находиться в разделе Meta.

person Daniel Silva    schedule 01.11.2017
comment
Вы действительно использовали это? Потому что я не вижу указаний в документации или исходном коде Django, что это сработает. - person Daniel; 21.12.2017