Добавить и инициализировать пользовательское поле в Django ModelForm

Я чувствую, что упускаю какой-то очень простой момент, но не могу решить это.
Допустим, у меня есть такая модель:

class Person(models.Model):
    first_name = models.CharField(max_length=256, blank=True)
    # this is weird field, but needed for my usecase
    last_name = models.WeirdCustomField(max_length=256, blank=True)

И есть форма для этого, которую я хотел бы немного настроить (комментарии):

class PersonForm(forms.ModelForm):

    class Meta:
        model = Address
        # I want to override 'last_name' field, so exclude it here
        exclude = ['last_name']

    # And add additional field
    my_field = ChoiceField(choices=list_of_choicec)
    last_name = forms.CharField()

    def __init__(self, *args, **kwargs):
        last_name = kwargs.pop('last_name', None)
        my_field = kwargs.pop('my_field', None)
        super(PersonForm, self).__init__(*args, **kwargs)
        self.fields['last_name'] = last_name
        self.fields['my_field'] = my_field

Теперь в shell (после всего импорта...)

person = Person.objects.get(first_name='Jacob')
person.first_name # Prints 'Jacob', correct!
form = PersonForm(instance=person, last_name='Smith', my_field='test123')
form['first_name'].value() # -> 'Jacob', that's right
form['last_name'].value() # -> nothing, I expected 'Smith'
form['my_field'].value() # -> nothing, I would like to see 'test123'

Я думаю, что я копаю Интернет очень глубоко, но не смог найти решения для такого рода проблемы.

1 ответ

Решение

Вы должны установить начальное значение. В вашей инициализации попробуйте заменить приведенный ниже код.

self.fields['last_name'].initial = last_name
self.fields['my_field'].initial = my_field

Инициал также может быть передан при создании экземпляра формы.

form = PersonForm(instance=person, initial={'last_name'='Smith', 'my_field'='test123'})

Это рекомендуемый способ сделать это. Не нужно переопределять метод init вообще.

Другие вопросы по тегам