限制Django formset中的可用选项

时间:2009-07-15 06:38:45

标签: django

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

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)

这似乎根本不会影响表单中的选择。这非常难看,可能是长时间看这个问题的结果。我也尝试使用自定义formset,但我似乎无法使自定义formset接受参数。

如何根据用户所在的团队在formset中限制我的subselect上Team字段的选项?

2 个答案:

答案 0 :(得分:1)

来自django model documentation

  

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

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

进一步的建议:

答案 1 :(得分:0)

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

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

((((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()]