2018年12月5日水曜日

DjangoのChoiceFieldの値を後から選択する方法

Django(2.1系)のFormを実装してまして、初期化後にChoiceFieldを変えたいという場面があったのですが、中々よい解決策が見当たらなかったのでメモ。



ざっくりこんな感じで用意している場合
#model.py

class Category(models.Model):
    text = models.CharField()


#form.py

class CategoryCreateForm(ModelForm):
    category = ChoiceField(queryset=Category.objects.none(), empty_label='---', error_messages={'invalid_choice':'error'})

    class Meta:
        model = Category
        fields = ['text']


よく解決策として出てくるのが、CreateFormに__init__を用意して引数で渡しているのを見かけるのですが、正しく値が渡らず上手くいきませんでした。 Djangoのバージョン問題?

NGパターン

def __init__(self, category, *args, **kwargs):
    super(QuestionCreateForm, self).__init__(*args, **kwargs)



単純にview.pyでinitialに設定すればOKでした。

view.py

form = CategoryCreateForm()
#本当は必要なselectのoptionが設定されるようにfilterするのがよい
form.fields['category'].queryset = Category.objects.all()
#選択したいvalueを設定すればよい
form.fields['category'].initial = Category.objects.get(id=1).id