表单(或Formset?)来处理Django中的多个表行

时间:2008-11-18 13:55:17

标签: python django

我正在研究我的第一个Django应用程序。简而言之,它需要做的是显示电影片名列表,并允许用户给每部电影评分(满分10分)。我已经能够在模板中使用{{form}}和{{formset}}语法来生成一个表单,该表单允许您一次评价一部电影,这对应于MySQL表格中的一行,但是如何做我制作了一个表格,它迭代数据库中的所有电影标题,并生成一个表格,让你一次评价它们的大部分?

起初,我认为这就是formset的用途,但是我看不出有什么方法可以自动迭代数据库表的内容来生成表单中的项目,如果你看到我的意思。 / p>

目前,我的views.py有以下代码:

def survey(request):
        ScoreFormSet = formset_factory(ScoreForm)
        if request.method == 'POST':
                formset = ScoreFormSet(request.POST, request.FILES)
                if formset.is_valid():
                        return HttpResponseRedirect('/')
        else:
                formset = ScoreFormSet()
        return render_to_response('cf/survey.html', {
                'formset':formset,
        })

我的survey.html有这个:

<form action="/survey/" method="POST">
<table>
{{ formset }}
</table>
  <input type = "submit" value = "Submit">
</form>

哦,ScoreForm的定义和来自models.py的得分是:

class Score(models.Model):
        movie = models.ForeignKey(Movie)
        score = models.IntegerField()
        user = models.ForeignKey(User)

class ScoreForm(ModelForm):
        class Meta:
                model = Score

所以,如果上面的内容不清楚,我打算制作的是每部电影一行的形式,每行显示一个标题,并有一个框允许用户输入他们的分数。

如果有人能指出我正确的方法,我将非常感激。

2 个答案:

答案 0 :(得分:3)

“起初,我认为这就是formset的用途,但是我看不出有什么方法可以自动迭代数据库表的内容来生成表单中的项目,如果你明白我的意思。 “

您需要获取一个查询集。并且您需要将该查询集作为初始数据提供给表单。有关代码,请参阅using initial data with a formset

initial = [ list of { dictionaries }, one per form ] 

有趣的是,这是通过查询集的values方法的模型API的直接功能。

答案 1 :(得分:0)

我找到了答案,使用modelformset_factory而不是formset_factory解决问题,谢谢......