Django - 多表单操作
我想做的是在一页上管理多个表单。我知道有表单集(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 会帮你处理剩下的事情。
这样你就可以在页面上放任意多个相同类型的表单了。