【问题标题】:Building a formset dynamically动态构建表单集
【发布时间】:2010-06-07 11:47:30
【问题描述】:

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

正如 SO 用户 Daniel Roseman 指出的那样,他会为此使用表单集,现在我意识到他一定是完全正确的。 :)

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

所以现在我的问题是:如何动态构建表单集?不是以 AJAX 方式,我希望每个表单的标签都填充数据库中的 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)))

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

谢谢!

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    感谢您对我不变的正确性的认可...

    您在这里可能需要的是一个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))
    

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

    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)
    

    这行得通吗?

    【讨论】:

    • 谢谢,不客气:)。现在我得到了一个带有团队下拉列表的表单。我希望将每个团队作为表单中的标签,并使用单选按钮进行选择。这意味着如果我有 8 个团队,则会呈现一个包含 8 个项目的列表(或行……)。这就是为什么我想做表格的“附加”。这可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2017-09-24
    • 2017-11-12
    • 2011-01-15
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多