Djangoのフォームのフィールド(CharFieldやIntegerFieldなど)に、CSSクラスを適用する方法として、下記のようにformに対して、wedget設定や、 __init__関数から指定する方法があります。
wedget設定
from django import forms
class TestForm(forms.Form):
name = forms.CharField(
max_length=30,
widget=forms.TextInput(
attrs={
"class": "input-field",
}
))
init
from django import forms
class TestForm(forms.Form):
name = forms.charField(max_length=30)
def __init__(self):
super().__init__(*args, **kwargs)
self.fields['name'].widget.attrs["class"] = "input_field"
しかし、この方法では、フロント側のtemplateコードのスタイルやjavascriptをカスタマイズする際に、formコードも意識しないといけなくなります。Vue.jsなどを利用する場合はソースの可読性が悪くなります。
そこで使用したのが、django-widget-tweaksというモジュールになります。
django-widget-tweaksは、テンプレートでフォームをレンダリングするときにやHTML属性を変更することができます。
インストールはpipで行います。
$ pip install django-widget-tweaks
インストールが完了したら、プロジェクトでwidget_tweaksを有効にするために、settings.pyファイルのINSTALLED_APPSにアプリを追加します。
INSTALLED_APPS = [
…
'widget_tweaks',
…
]
templateでの使用方法は下記の通りです。
{%load widget_tweaks%}
{%render_field form.name class="input_field" %}
Vue.jsなど属性に:コロンを使用する場合は::2重コロンで表記します。
{%load widget_tweaks%}
{%render_field form.name v-on::change="changeFunc" %}
また、フィルターのattrやadd_classを使用することができます。
{%load widget_tweaks%} {{ form.name | attr:"class:input_field" }} {{ form.name | add_class:"input_field" }}