My Fucking Note

Software Engineeringのメモ

DjangoのFormのレンダリング方法

動作確認用のFormとViewを準備する

forms.py

from django import forms


class MyForm(forms.Form):
    name = forms.CharField(max_length=10)
    age = forms.IntegerField(min_value=0, max_value=120)

views.py

from django.views.generic import FormView

from .forms import MyForm


class MyFormView(FormView):
    form_class = MyForm
    template_name = 'my_form.html'

    def form_valid(self, form):
        print(form.cleaned_data)
        return super().form_valid(form)

レンダリングを全てFormクラスに任せる

templates/my_form.html

{{ form }}

フィールドを個別にレンダリングする templates/my_form.html

<form action="" method="POST">
  {% csrf_token %}
  {{ form.non_field_errors }}
  {{ form.name.label_tag }}
  {{ form.name }}
  {{ form.name.errors }}
  {{ form.age.label_tag }}
  {{ form.age }}
  {{ form.age.errors }}
  <button type="submit">作成</button>
</form>

django-widget-tweaksでフィールドの属性を細かく制御する templates/my_form.html

{% load widget_tweaks %}

<form action="" method="POST">
  {% csrf_token %}
  {{ form.non_field_errors }}
  {{ form.name.label_tag }}
  {% render_field form.name class+="class1 class2" placeholder="名前を入力してください" %}
  {{ form.name.errors }}
  {{ form.age.label_tag }}
  {{ form.age }}
  {{ form.age.errors }}
  <button type="submit">作成</button>
</form>