2

と の 2 つのモデルがLeagueありTeamます。Teamには への外部キー リンクがありLeagueます。Teamに格納されている値に基づいて、 で使用できる選択肢を設定できるようにしたいと考えていますLeague。具体的には:

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.choicesを正確に定義できないことを認識しています。Teamしたがって、次のように設定することを期待してTeamいます:

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

私はのを設定しましModelFormTeam

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))

league.idを使用するために必要な foo は何ですか?league.number_of_teamsのビューは、表現するフィールドをTeamModelForm事前入力し、次のようにレンダリングします。team.leagueteam.draft_slot

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

1 に答える 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=())}
于 2012-10-25T19:44:35.173 に答える