动态构建formset

时间:2010-06-07 11:47:31

标签: django django-forms

我最初编写的代码是根据数据库中的数据动态构建表单,类似于我在previous SO post中描述的内容。

正如SO用户丹尼尔罗斯曼指出的那样,他会使用一个表格,现在我已经意识到他必须完全正确。 :)

我的方法基本上可行,但我似乎无法在整个表单中进行验证以正常工作(我相信这是可能的,但它变得非常复杂,并且必须有一种更聪明的方法来做到这一点= > Formsets!)。

所以现在我的问题是:我如何动态构建一个formset?不是以AJAX方式,我希望每个表单的标签都填充来自DB的FK值(团队)。

由于我需要将参数传递给表单,因此我使用了之前SO帖子中的this technique

使用前一种方法,我的视图代码是(上一个链接中的表单代码):

def render_form(request):
  teams = Team.objects.filter(game=game)
  form_collection = [] 
  for team in teams:
            f = SuggestionForm(request.POST or None, team=team, user=request.user)
            form_collection.append(f)

现在我想做点什么:

def render_form(request):
  teams = Team.objects.filter(game=game)
  from django.utils.functional import curry
  from django.forms.formsets import formset_factory

  formset = formset_factory(SuggestionForm)
  for team in teams:
      formset.form.append(staticmethod(curry(SuggestionForm, request.POST or None, team=team, user=request.user)))

但附加位不起作用。这样做的正确方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:4)

感谢我对不变权利的认可......

这里你需要的是model formset,它会自动从你传入的查询集中构建自己:

from django.forms.models import modelformset_factory

def render_form(request):
    teams = Team.objects.filter(game=game)
    formset = modelformset_factory(form=SuggestionForm, queryset=teams)

至于动态参数,我猜是user,我以前使用了闭包解决方案,但curry方法仍然有效:

    formset.form = staticmethod(curry(SuggestionForm, user=request.user))

评论后修改感谢您的澄清。我想我明白你要做什么。我想知道内联formset是否可以更好地工作?如果您开始使用预先填充了八个相关Team对象的Game对象,则内联formset将为您提供八个预先存在的表单。

my_game = Game.objects.create(params=whatever)
for i in range(1, 9):
    team = Team.objects.create(game=my_game, name="team_%s" % i

formset = inlinemodelformset_factory(Game, Team, form=SuggestionForm)
fs = formset(instance=my_game)

这有用吗?