Django - 多表单操作

28 投票
1 回答
18588 浏览
提问于 2025-04-15 19:58

我想做的是在一页上管理多个表单。我知道有表单集(formsets),也知道表单管理是怎么回事,但我在想法上遇到了一些问题。

为了让你更好地理解我的问题,我会用 Django 的示例模型来说明:

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField()

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

现在,假设我已经创建了表单类:

from django import forms
from mysite.polls.models import Poll, Choice

class PollForm(forms.ModelForm):
    class Meta:
        model = Poll

class ChoiceForm(forms.ModelForm):
    class Meta:
        model = Choice
        exclude = ('poll',) 

我想在同一页面上有多个 Poll(投票)和 Choice(选项)模型的表单实例,而且这些模型可以重复出现:

<form action="{{url}}" method="post">
    {{pollform}}
    {{choiceform}}
    {{pollform}}
</form>

如你所见,这里有两个 Poll 表单和一个 Choice 表单,但这两个 Poll 表单之间夹着一个 Choice 表单。我需要这些表单在页面上保持顺序,所以使用表单集会有点困难。

我遇到的问题是,提交的数据中所有的值都用“answer”这个名字,所以我得到的是一个所有表单中元素的列表,都是叫“answer”,我无法分辨哪些属于哪个表单。

不知道我的解释是否清楚地表达了我的问题。有没有什么想法可以解决这个问题呢?

谢谢你的帮助!

附注:不要在意 Poll 和 Choice 之间的关系,这些模型只是为了说明问题,所以它们的关系并不重要。

1 个回答

58

使用 prefix 这个参数

你可以这样声明你的表单:

form = MyFormClass(prefix='some_prefix')

然后,只要前缀相同,就可以这样处理数据:

form = MyFormClass(request.POST, prefix='some_prefix')

Django 会帮你处理剩下的事情。

这样你就可以在页面上放任意多个相同类型的表单了。

撰写回答