如何在Django表单中创建字段列表

2024-05-23 17:35:58 发布

您现在位置:Python中文网/ 问答频道 /正文

有什么方法可以使django forms类实际上包含一个字段数组吗?我有一个数据库,它会向用户提出各种各样的问题,每个问题都知道如何定义它的小部件……等等,我只是不能把它连接到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 forms获取可变数量的表单字段,或者这超出了它所能做的范围?


Tags: django方法用户form数据库表单定义部件
2条回答

如果表单相同(包括它们的标签),则可以使用formsets。e、 g

问题:“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”
问题:“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”
问题:你

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


如果您需要单个表单中的动态字段数,那么可以使用__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/

你当然可以!

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,这是一个表单列表,在您的情况下可能更合适。

相关问题 更多 >