簡體   English   中英

在Django ModelForm中添加並初始化自定義字段

[英]Add and initialize custom field in 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'

我認為我深入挖掘互聯網,但無法找到解決這類問題的方法。

您必須設置初始值。 在您的init嘗試使用以下代碼替換。

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方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM