Отключение поля Django ModelForm без явного объявления - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть этот код:

class MyModel(models.Model):
    input_field = model.CharField(max_length=100)


class MyModelForm(forms.ModelForm):

    input_field = forms.CharField(disabled=True)    

    class Meta:
        model = MyModel

Я также читал из документов :

Когда вы явно создаете экземпляр поля формы, подобного этому, важно понимать, как связаны ModelForm и обычный Form.

...

Поля, определенные декларативно, остаются как есть, поэтому любые настройки, сделанные для атрибутов Meta, такиепоскольку виджеты, метки, help_texts или error_messages игнорируются;они применяются только к полям, которые генерируются автоматически.

Аналогично, поля, определенные декларативно, не рисуют свои атрибуты, такие как max_length или требуемые из соответствующей модели.Если вы хотите сохранить поведение, указанное в модели, вы должны явно задать соответствующие аргументы при объявлении поля формы.

Можно ли передать kwargs в поле формы таким образом, чтобы я могуказать disabled=True без потери преимуществ интроспекции и настройки ModelForm s?Essential, могу ли я взять свой торт и съесть его?

Я знаю, что могу обойти это, используя widgets = {'input_field': widgets.TextInput(attrs={'readonly':'readonly'})} в классе Meta, но мне интересно, есть ли лучший способдоступно

Также не ясно, будет ли изменение атрибута widgets, как указано выше, "наследовать" конфигурацию по умолчанию, которую иначе применила бы ModelForm, например, вывести max_length из базовой модели.

1 Ответ

0 голосов
/ 28 февраля 2019

Наверное, самое простое - переопределить __init__.

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['input_field'].disabled = True
...