0

次のようなフォームがあります

class InstructorCourseCertificationForm(forms.Form):
    Course = forms.BooleanField()
    SubjectExpert = forms.BooleanField(label='Subject Expert')

これらのフォームセットを作成し、持っているコースのリストに応じて Course フィールドのラベルを動的に設定する必要があります。

4

1 に答える 1

0

動的フィールドが必要な私の経験では、通常、データをデータベースに保存し、データベースのデータに従って動的フォームを生成することになりました。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取得してから証明書フォームを作成するヘルパー関数を作成できます。しかし、どちらにしても、考え方は同じです。

ただし、この時点では、フィールドが正常であるという保証はありません。その場合、フィールドの定義には( )の代わりにOrderedDictfromを使用する必要があります。collectionsdict{}

この方法がどれだけうまくいくかはわかりませんFormSetsが、おそらくそれはあなたにいくつかのアイデアを与えることができます。

于 2012-09-17T22:57:02.273 に答える