如何在基于put的ModelForm外键字段中列出对象

时间:2012-03-15 18:31:57

标签: django django-forms

当我进入一个特定比赛的入围球员时,我需要将特定球队的球员列入候选名单。我的表格字段给了我所有玩家的列表。我跟着这封信

http://www.wkoorts.com/wkblog/2009/08/10/pre-populate-django-modelform-with-specific-queryset/

但它给了我属性错误。这是我的代码forms.py

class ShortlistForm(ModelForm):
    class Meta:
        model = PlayerShortlist
        fields = (
            'player',
        )

和我的view.py

def shortlist(request, team_id, fixture_id):
    template = get_template('cricket/shortlist.html')
    loggedinuser = request.user
    userteam = Team.objects.get(owner=loggedinuser)
    form = ShortlistForm
    #get the players only belonging to this team_id
    form.fields['player'].queryset = Player.objects.filter(team=userteam)
    currentteam = Team.objects.get(id=team_id)
    page_vars = Context({
        'form': form,
        'loggedinuser': loggedinuser,
        'team': userteam
    })
    output = template.render(page_vars)
    return HttpResponse(output)

如果我删除该行

form.fields['player'].queryset = Player.objects.filter(team=userteam)

它给了我这个错误。

AttributeError at /team/1/fixture/1/shortlist/
type object 'ShortlistForm' has no attribute 'fields'

我做错了什么?

//小鼠

当我们在这里时,如果我可以列出所有带有复选框的玩家,要放入数据库,而不是老板有一个下拉列表..我应该从formset中选择什么?

//小鼠

再次,自己解决了。

需要先发表表格。

form = ShortlistForm

应该是

form = ShortlistForm()

//小鼠

1 个答案:

答案 0 :(得分:4)

这里有点:

  1. 为什么要将request.user分配给loggedinuser?它的击键次数完全相同,因此您不需要保存任何内容,只需抽象逻辑并为代码添加失败点。

  2. 分配form时,您要分配,而不是该类的实例。你需要:

    form = ShortlistForm()
    
  3. 在定义currentteam时,您需要了解传递错误team_id的可能性。最简单的方法是使用get_object_or_404

    currentteam = get_object_or_404(Team, id=team_id)
    
  4. 除非Team.ownerOneToOneField,否则您将遇到Team.owner.get(owner=loggedinuser)的问题。对于你为什么要在这里找到两支不同的球队,这也令人困惑。如果您只想将Players过滤到属于当前用户的团队,那么以下内容会更简单,更安全:

    Player.objects.filter(team__owner=request.user)
    
  5. 然而,为什么你这样做是没有意义的。您所说的评论应该针对当前team_id进行过滤,这有助于根据包含team_id参数的网址进行操作。我假设您只是想要由当前团队过滤,但也希望确保该团队归登录用户所有(用户拥有该权限)。如果是这种情况,以下是您实际需要的内容:

    team = get_object_or_404(Team, id=team_id, owner=request.user)
    ...
    Player.objects.filter(team=team)
    
  6. 获取模板,渲染模板以及手动返回响应的整个过程是不必要的,相当于代码膨胀。只是做:

    # Django 1.3+
    return render(request, 'cricket/shortlist.html', page_vars)
    

    OR

    # Django <1.3
    return render_to_response('cricket/shortlist.html', page_vars, RequestContext(request))
    

    在该方案中,使page_vars成为常规旧字典,而不是Context的实例。这也有将request带入您的模板上下文的好处,因此您也可以在request.user使用loggedinuser,而不必传递def shortlist(request, team_id, fixture_id): team = get_object_or_404(Team, id=team_id) if request.method == 'POST': form = ShortlistForm(request.POST) #get the players only belonging to this team_id form.fields['player'].queryset = Player.objects.filter(team=team) if form.is_valid(): return HttpResponseRedirect('/path/to/next/view/') else: form = ShortListForm() #get the players only belonging to this team_id form.fields['player'].queryset = Player.objects.filter(team=team) return render(request, 'cricket/shortlist.html', { 'form': form, 'team': team, })

  7. 所以,有了这个,这是你的新观点:

    {{1}}