2012-10-25 32 views
2

我有两个模型:LeagueTeamTeam有一个到League的外键链接。我希望能够根据存储在League中的值为Team设置可用选项。具体做法是:django模型表单,限制在ForeignKey模型中基于值的选择

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

我承认我无法准确定义我draft_slot.choicesTeam模型。所以,我希望建立Team像这样:

class Team(models.Model): 
    league = models.ForeignKey(League) 
    draft_slot = models.IntegerField() 

我已成立了一个ModelFormTeam的:

class TeamModelForm(ModelForm): 
    class Meta: 
     model = Team 

而且的TeamModelForm一个观点:

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看起来像

draft_slot = models.IntegerField(choices=[(i+1,i+1) for i in range(league.number_of_teams+1)]) 

回答

3

工作答案:

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=())} 
+0

我小心翼翼地通过代码加强。如果我设置n = self.instance.league.number团队数量,我会得到一个我可以迭代的数字。 self.fields。['draft_slot']。选项失败。我试图设置它等于1,到(1,1)到((1,1),)以及给定的代码。当查看TeamModelForm时,代码无法提供经典的下拉列表选项。其他一切看起来不错。 – Cole

+0

@cole查看上面的精化代码。注意'self.fields ['draft_slot']。widget.choices',而不是'self.fields ['draft_slot']。choices'。告诉我它是否有效。 – rantanplan

+0

你非常接近!它在我将以下行添加到类Meta后起作用:widgets = {'draft_position':Select(choices =())} – Cole