django 模型形式,根据 ForeignKey 模型中的值限制选择 [英] django model form, restrict choices based on value in ForeignKey model
问题描述
我有两个模型:League
和 Team
.Team
有一个到 League
的外键链接.我希望能够根据存储在 League
中的值为 Team
设置可用的选项.具体:
I have two models: League
and Team
. Team
has a foreign key link to League
. I want to be able to set choices available for the Team
based on values stored in League
. Specifically:
class League(models.Model):
number_of_teams = models.IntegerField()
class Team(models.Model):
league = models.ForeignKey(League)
draft_slot = models.IntegerField(choices=[(i+1,i+1) for i in range(?????????)])
我认识到我无法在 Team
模型中准确定义我的 draft_slot.choices
.所以我希望像这样设置 Team
:
I recognize I cannot accurately define my draft_slot.choices
in the Team
model. So I would expect to set up Team
like so:
class Team(models.Model):
league = models.ForeignKey(League)
draft_slot = models.IntegerField()
我已经建立了一个Team
的ModelForm
:
class TeamModelForm(ModelForm):
class Meta:
model = Team
以及Team
ModelForm
的视图:
def SetupTeam(request, fanatic_slug=None, league_slug=None):
league = League.objects.get(slug=league_slug)
form = TeamModelForm()
return render_to_response('league/addteam.html', {
'form': form
}, context_instance = RequestContext(request))
我需要什么 foo 才能使用 league.id
、league.number_of_teams
所以 TeamModelForm
的视图预填充 team.league
并渲染一个字段来表示 team.draft_slot
看起来像
What foo do I need in order to use league.id
, league.number_of_teams
so the view of TeamModelForm
prepopulates team.league
and also renders a field to represent team.draft_slot
to look like
draft_slot = models.IntegerField(choices=[(i+1,i+1) for i in range(league.number_of_teams+1)])
推荐答案
有效答案:
class TeamModelForm(ModelForm):
def __init__(self, *args, **kwargs):
super(TeamModelForm, self).__init__(*args, **kwargs)
if self.instance:
n = self.instance.number_of_teams
self.fields['draft_position'].widget.choices = [(i+1,i+1) for i in range(n)]
class Meta:
model = Team
widgets = {'draft_position': Select(choices=())}
这篇关于django 模型形式,根据 ForeignKey 模型中的值限制选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!