2012-10-25 3 views
2

J'ai deux modèles: League et Team. Team a un lien de clé étrangère vers League. Je veux être en mesure de définir les choix disponibles pour le Team en fonction des valeurs stockées dans League. Plus précisément:forme de modèle django, restreindre les choix basés sur la valeur dans le modèle 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(?????????)]) 

Je reconnais que je ne peux pas définir avec précision mon draft_slot.choices dans le modèle Team. Donc, je me attends à mettre en place Team comme ceci:

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

J'ai mis en place un ModelForm de Team:

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

Et vue sur la 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)) 

Qu'est-ce que foo ai-je besoin afin d'utiliser league.id, league.number_of_teams de sorte que la vue de TeamModelForm préremplit team.league et rend également un champ pour représenter team.draft_slot pour ressembler à

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

Répondre

3

la réponse de travail:

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

J'étagé attentivement le code. Si je mets n = self.instance.league.number des équipes, j'obtiens un nombre que je peux parcourir. Le self.fields. ['Draft_slot']. Choix échoue. J'ai essayé de le mettre égal à 1, à (1,1) à ((1,1),) ainsi que le code donné. Le code ne parvient pas à fournir la liste déroulante classique des choix lorsque TeamModelForm est affiché. Tout le reste a l'air génial. – Cole

+0

@cole Voir le code raffiné ci-dessus. Notez le 'self.fields ['draft_slot']. Widget.choices', au lieu de' self.fields ['draft_slot']. Choices'. Dites-moi si cela fonctionne. – rantanplan

+0

Vous étiez très proche! Cela a fonctionné après avoir ajouté la ligne suivante à la classe Meta: widgets = {'draft_position': Select (choices =())} – Cole

Questions connexes