代码之家  ›  专栏  ›  技术社区  ›  Ogre Codes

限制Django表单集中的可用选项

  •  0
  • Ogre Codes  · 技术社区  · 17 年前

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

    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)
    

    这似乎根本不会影响表格中的选择。这相当丑陋,可能是长时间关注这个问题的结果。我也尝试过使用自定义表单集,但似乎无法让自定义表单集接受该参数。

    2 回复  |  直到 17 年前
        1
  •  1
  •   rob    17 年前

    自 django model documentation :

    最后,请注意,选项可以是任何 列表或元组。这使您可以构建 动态选择。但如果你发现 你自己黑客的选择 动态,你可能会更好 使用适当的数据库表 静态数据变化不大,

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

        2
  •  0
  •   Daniel Roseman    17 年前

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

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

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