2012-10-25 73 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