当我进入一个特定比赛的入围球员时,我需要将特定球队的球员列入候选名单。我的表格字段给了我所有玩家的列表。我跟着这封信
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()
//小鼠
答案 0 :(得分:4)
这里有点:
为什么要将request.user
分配给loggedinuser
?它的击键次数完全相同,因此您不需要保存任何内容,只需抽象逻辑并为代码添加失败点。
分配form
时,您要分配类,而不是该类的实例。你需要:
form = ShortlistForm()
在定义currentteam
时,您需要了解传递错误team_id
的可能性。最简单的方法是使用get_object_or_404
:
currentteam = get_object_or_404(Team, id=team_id)
除非Team.owner
是OneToOneField
,否则您将遇到Team.owner.get(owner=loggedinuser)
的问题。对于你为什么要在这里找到两支不同的球队,这也令人困惑。如果您只想将Players
过滤到属于当前用户的团队,那么以下内容会更简单,更安全:
Player.objects.filter(team__owner=request.user)
然而,为什么你这样做是没有意义的。您所说的评论应该针对当前team_id
进行过滤,这有助于根据包含team_id
参数的网址进行操作。我假设您只是想要由当前团队过滤,但也希望确保该团队归登录用户所有(用户拥有该权限)。如果是这种情况,以下是您实际需要的内容:
team = get_object_or_404(Team, id=team_id, owner=request.user)
...
Player.objects.filter(team=team)
获取模板,渲染模板以及手动返回响应的整个过程是不必要的,相当于代码膨胀。只是做:
# 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,
})
。
所以,有了这个,这是你的新观点:
{{1}}