プログラミングメモ帳

プログラミングで躓いた部分を中心としたIT土方的メモ。

ModelFormを利用して生成されるHTMLフォーム内の要素のnameタグを変更する

Django で Model を利用して入力画面を作る際には ModelForm クラスを利用しますが、
Model のフィールド名と、投げられるリクエストの名前規則が一致しないことがあります。

リクエストを投げる側の動作を変更したくない(できない)場合、以下のように、ModelFormクラス内のadd_prefix()をオーバライドすることで、フォーム内の要素の name 属性の値を変更することが出来ます。


FIELD_NAME_MAPPING = {
    # 'Modelクラスのフィールド名' : 'name属性の値'
    'field1': 'html_field1',
    'field2': 'html_field2'
}

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'

    def add_prefix(self, field_name):
        field_name = FIELD_NAME_MAPPING.get(field_name, field_name) # dict に存在しない場合はフィールド名を利用する
        return super(MyForm, self).add_prefix(field_name)


この add_prefix()メソッドですが、元々の動作はメソッド名の通り、 name 属性に設定されるフィールド名全てに接頭辞を与えるというものです。 この使い方の場合は、ModelForm のフィールドとして prefix = 'hoge' のように与えてやれば良いみたいです。
name 属性に設定する値をまるごと返す設計になっているので、Model クラスのフィールド名に縛られず自由に書き換えることができます。


参考

stackoverflow.com

https://docs.djangoproject.com/ja/1.11/_modules/django/forms/forms/docs.djangoproject.com