[Django]ChoiceFieldのchoicesに関数を指定したい

Djangoのformで、ChoiceFieldのchoicesには固定のtupleを指定したり、ModelForm任せだったりすることがほとんどだったのですが、独自に加工した一覧を出したくて、choicesに関数を指定しようとしました。

ただ、素直に関数名をforms.ChoiceField(choices=func_name)と指定しただけだと、
‘function’ object is not iterable
と怒られてしまいました。

どうしたものかとググっていたら、見つけました

python – Lazy choices in Django form – Stack Overflow

djangoのlazyというユーティリティを使って関数を与える方法が書いてありました!

  1. from django.utils.functional import lazy
  2.  
  3.     forms.ChoiceField(choices=lazy(func_name, tuple)())

こんな感じですね。これは使える!

とか思ってたけど、やりたいことこれじゃないよ!あと1歩だった。
ModelFormにinstanceをセットして、そのinstanceの中身によって変動するchoicesって作れるのかな?(こっちが知りたかった

P.S.
結局やりたい事はModelChoiceFieldでした。知らなかった。querysetを適切に与えてやるためにFormの__init__()を上書きして必要なインスタンスを渡してあげています。だいたい以下のような感じ

  1. class HogeForm(forms.ModelForm):
  2.     foo = forms.ChoiceField(choices=())
  3.     bar = None
  4.  
  5.     class Meta:
  6.         model = Hoge
  7.         fields = ('foo', )
  8.  
  9.     def __init__(self, bar, *args, **kwargs):
  10.         super(HogeForm, self).__init__(*args, **kwargs)
  11.         self.bar = bar
  12.         self.fields['foo'] = forms.ModelChoiceField(queryset=Foo.objects.filter(bar=bar))
  13.  
  14.     def save(self, commit=False):
  15.         hoge = super(HogeForm, self).save(commit=False)
  16.         hoge.bar = self.bar
  17.         return hoge.save()

About: uechoco