2017-12-01 23 views
0

私はいくつかの非常に基本的な点が欠けているように感じますが、これを解決することはできません。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

初期値を設定する必要があります。あなたの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メソッドをオーバーライドする必要はありません。

+0

驚くべきことに、近いうちに自分自身を理解するとは思わない、ありがとう!私はまた、それは非常に直観的ではないと言う必要がありますが、私はそれがフレームワークの方法だと思います。 –

+0

あなたのinitにself.fields ['my_field']を表示してみてください。あなたはそれが何であるかを見ることができます。 –

関連する問題