次のようなフォームがあります
class InstructorCourseCertificationForm(forms.Form):
Course = forms.BooleanField()
SubjectExpert = forms.BooleanField(label='Subject Expert')
これらのフォームセットを作成し、持っているコースのリストに応じて Course フィールドのラベルを動的に設定する必要があります。
次のようなフォームがあります
class InstructorCourseCertificationForm(forms.Form):
Course = forms.BooleanField()
SubjectExpert = forms.BooleanField(label='Subject Expert')
これらのフォームセットを作成し、持っているコースのリストに応じて Course フィールドのラベルを動的に設定する必要があります。
動的フィールドが必要な私の経験では、通常、データをデータベースに保存し、データベースのデータに従って動的フォームを生成することになりました。forms.Form
つまり、後でカスタマイズするベースのクラスは作成しませんが、Pythonのtype
関数を使用して最初からクラスを作成します。
例では、これはより明確かもしれないと思います。フィールドを含むモデルCourse
があるとします。name
class Course(models.Model):
name = models.CharField(max_length=64)
したがって、モデルにメソッドを追加することで、フォームを最初から作成できます。
class Course(models.Model):
...
def certificate_form_class(self):
# assuming the name can only have spaces
# if not, then more normalizing has to be done
form_name = self.name.title().replace(' ', '')
bases = (forms.Form,)
fields = {
'Course': forms.BooleanField(label=self.name),
'SubjectExpert': forms.BooleanField(label='Subject Expert')
}
form_class = type(form_name, bases, fields)
return form_class
次に、これを次のように使用できます。
course = Course.objects.get(...)
certificate_form_class = course.certificate_form_class()
certificate_form = certificate_form_class()
# use it as a regular form
この時点でフォームとモデルを混合していると主張する人もいるかもしれません。その場合forms.py
、モデルのインスタンスをCourse
取得してから証明書フォームを作成するヘルパー関数を作成できます。しかし、どちらにしても、考え方は同じです。
ただし、この時点では、フィールドが正常であるという保証はありません。その場合、フィールドの定義には( )の代わりにOrderedDict
fromを使用する必要があります。collections
dict
{}
この方法がどれだけうまくいくかはわかりませんFormSets
が、おそらくそれはあなたにいくつかのアイデアを与えることができます。