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 クラスのフィールド名に縛られず自由に書き換えることができます。
参考
https://docs.djangoproject.com/ja/1.11/_modules/django/forms/forms/docs.djangoproject.com