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 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))
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)])
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
@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
Vous étiez très proche! Cela a fonctionné après avoir ajouté la ligne suivante à la classe Meta: widgets = {'draft_position': Select (choices =())} – Cole