ModelFormでForeignKeyのModelChoiceFieldをカスタマイズ
models.py
class Type(models.Model): name = models.CharField(max_length=255) class Blog(models.Model): title = models.CharField(max_length=255) contents = models.CharField(max_length=255) type = models.ForeignKey(Type)
という場合にBlogのFormクラスを作ろうとして
from django.forms import ModelForm class BlogForm(ModelForm): class Meta: model = Blog
とした場合テンプレートに出力されるHTMLが
<select name="type" id="id_type"> <option value="" selected="selected">---------</option> <option value="1">Type object</option> <option value="2">Type object</option> </select>
つまりoptionの中身はType objectじゃなくてType objectのnameになってほしいところなんだけど残念な感じになってしまうので
ModelChoiceFieldを継承してカスタマイズします
from django.forms.models import ModelChoiceField class CustomChoiceField(forms.ModelChoiceField): #ここで表示したい形式にします def label_from_instance(self, obj): return u'%s' % obj.name class BlogForm(ModelForm): #typeを上で作成したCustomChoiceFieldに変更します type = CustomChoiceField(queryset=Type.objects.all()) class Meta: model = Blog
カスタマイズ後のHTMLは
<select name="type" id="id_type"> <option value="" selected="selected">---------</option> <option value="1">hoge</option> <option value="2">fuba</option> </select>
という感じでTypeオブジェクトのnameの値に変更されています、めでたしめでたし。
でもこういう需要って結構あると思うんだけどわざわざModelChoiceFieldを継承してごにょごにょしてって面倒くさいんだけどフィールドオプションで表示したい形式を指定できればいいのに・・・もしかしてもうあったりするのかな?
知ってる人いたら教えてください。