DjangoのModelFormに属性を追加する

tableの1行分のtdにフォーム要素を分けて入れたい場面があり、Djangoで行うにはちょっと工夫が必要だったのでそのメモを残しておきます。

まず、従来のフォームはformタグの中にinputなどのフォーム内要素を書きますが、HTML5からformタグとフォーム内要素を別々に書くことができるようになりました。

この辺りは、このサイトに書いてあることを参考にさせていただきました。

formタグにidを持たせ、フォーム内要素のform属性にそのIDを指定してやればいいみたいですね。

tableタグを書く前にformタグを書いてしまえば、エラーにならずにフォームを自由に記述できます。

例えば、hogeというTextInputを持つフォームにfugaみたいなIDを付けてHTML5的に書きたい場合は、Django内で

form = SomeForm()
form.fields["hoge"].widget = TextInput(attrs={'form': 'fuga'})

のような形でフォームを作ることによって実現できます。これでTextInputフォームの出力にはIDが含まれます。

また、

class SomeForm(ModelForm):
    class Meta:
        model = SomeModel
        fields = ('hoge', )
        widgets = {
            'hoge': TextInput(attrs={'form': 'fuga'})
        }

のようにも記述できますが、動的に生成できるか不安なので前者の方法を使いました。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする