Django: Использовать виджеты в методе init формы?

Почему виджет для поля, определенного как атрибут класса, работает, а для атрибута экземпляра внутри метода __init__ - нет? (Мне нужен метод init)

class CropForm(forms.ModelForm):

    class Meta:
        model = CropModel
        fields = ['name', 'label']

    label = forms.CharField(label='label',
                        widget=forms.TextInput(attrs={'class': 'input'}))

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

        super().__init__(*args, **kwargs)
        self.name = forms.CharField(label='name',
                            widget=forms.TextInput(attrs={'class': 'input'}))

form image

Как заставить работать виджет в методе __init__? Спасибо.

Вы совсем близко:

class CropForm(forms.ModelForm):

    class Meta:
        model = CropModel
        fields = ['name', 'label']

    label = forms.CharField(
        label='label', widget=forms.TextInput(attrs={'class': 'input'})
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['name'] = forms.CharField(
            label='name', widget=forms.TextInput(attrs={'class': 'input'})
        )

Джанго Form использует метапрограммирование, чтобы посмотреть, какие поля формы определены. Каждый раз, когда вы инициализируете форму, в self.fields создаются копии, которые затем отображаются. Таким образом, при рендеринге форма будет смотреть не на атрибуты класса, а на self.fields словарь.


Примечание: Модели обычно не имеют суффикса …Model. Поэтому, возможно, лучше переименовать CropModel в Crop.

Вернуться на верх