12

有没有办法制作一个实际包含字段数组的 django 表单类?我有一个数据库,它会提取可变数量的问题来询问用户,每个问题都会知道如何定义它的小部件......等等,我似乎无法将它连接到 django 表单。

我试过这个:

class MyForm(forms.Form):
    question = []
    questions = Question.objects.all()
    for q in questions:
        question.append(forms.CharField(max_length=100, label=q.questionText))

但是,当我创建一个新实例时,这似乎并没有暴露我的问题列表MyForm。有没有办法使用 django 表单获取可变数量的表单字段,或者这超出了它可以做的范围?

4

2 回答 2

17

如果您的表单相同(包括它们的标签),您也许可以使用表单集。例如

问题:__________________
问题:__________________
问题:__________________

等等。我假设每个表单在这里只包含一个字段(“问题”字段)。本例中共有三种形式。


如果您需要单个表单中的动态数量的字段,那么您可以使用__init__来实现您想要的(注意:未经测试的代码!):

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        questions = kwargs.pop('questions')
        super(MyForm, self).__init__(*args, **kwargs)
        counter = 1
        for q in questions:
            self.fields['question-' + str(counter)] = forms.CharField(label=question)
            counter += 1

您将使用以下内容创建表单:

form = MyForm(questions=your_list_of_questions)

你会发现这篇文章很有用:http: //jacobian.org/writing/dynamic-form-generation/

于 2013-06-18T02:26:57.113 回答
6

当然可以!

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        for i, q in enumerate(Question.objects.all()):
            self.fields['%s_field' % i] = forms.CharField(max_length=100, label=q.questionText)

注意:确保您的问题在两次通话之间排序......因为字段列表将在表单提交、收据等时重新填充。

如果数据是有序且静态的,则不会有问题。

此外,您可能想查看FormSets,一个可能更适合您的情况的表格列表。

于 2013-06-18T02:26:14.393 回答