【问题标题】:Limiting available choices in a Django formset限制 Django 表单集中的可用选择
【发布时间】:2010-11-10 21:56:19
【问题描述】:

我有一个表单集,其中包含一个“团队”字段,该字段应仅限于当前用户所属的团队。

def edit_scrapbook(request):
    u=request.user
    ScrapbookAjaxForm = modelformset_factory(Scrapbook, fields=
          ('description','status','team'))
    choices=False
    for t in u.team_set.all():
        if choices:
            choices=choices,(t.id,t.name)
        else:
            choices=choices,(t.id,t.name)
   if request.method == 'POST':
        formset = ScrapbookAjaxForm(request.POST, 
            queryset=Scrapbook.objects.filter(owner=u))
        if formset.is_valid():
            instances=formset.save(commit=False)
            for i in instances:
                i.owner=request.user
                i.save()
            formset.save_m2m()    
            return HttpResponseRedirect(reverse('scrapbooks.views.index'))
    else:
        formset = ScrapbookAjaxForm(queryset=Scrapbook.objects.filter(owner=u))
        for form in forms:
            for field in form:
                if field.label == 'Team':
                    field.choices=choices
    c=RequestContext(request)
    return render_to_response('scrapbooks/ajax_edit.html', 
             {'fs':formset},context_instance=c)

这似乎根本不影响表单中的选择。这很丑陋,可能是因为研究这个问题太久了。我也尝试过使用自定义表单集,但我似乎无法让自定义表单集接受参数。

如何根据用户所在的团队限制表单集中子选择中“团队”字段的选择?

【问题讨论】:

    标签: django


    【解决方案1】:

    来自django model documentation

    最后,请注意,选择可以是任何 可迭代对象——不一定是 列表或元组。这使您可以构建 动态选择。但如果你发现 自己黑客的选择是 动态的,你可能会更好 使用适当的数据库表 外键。选择是为了 变化不大的静态数据, 如果有的话。

    我会使用相同的想法:在表单中,您为团队使用 ForeignKey,然后您可以通过一些查询来限制该列表。

    一些进一步的建议:

    【讨论】:

    • 如何将可迭代对象列表发送到表单集?这是我遇到问题的地方,我似乎无法让我在视图中进行的任何设置都粘贴在表单集中。
    • 好的,我添加了一种可能的方法来设置可迭代列表。
    【解决方案2】:

    不确定这是否是问题的原因,但您构建选择元组的方式存在很大问题。

    四支球队之后,选择将如下所示:

    ((((False, (1, u'Team 1')), (2L, u'Team 2')), (3, u'Team 3')), (4, u'Team 4'))
    

    这显然对设置选择字段无效。一个更好的方法是使用列表推导代替整个循环:

    choices = [(t.id,t.name) for t in u.team_set.all()]
    

    【讨论】:

    • 谢谢!我还不习惯在 Python 中使用列表,这是一种更简洁的方法,并且正如您所说的那样会生成正确的结果。不幸的是没有解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多