Форма модели Django, ограничить выбор на основе значения в модели ForeignKey

У меня есть две модели:League а также .TeamTeam имеет ссылку на внешний ключ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()

Я создалModelForm из:Team

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.idleague.number_of_teams поэтому мнениеTeamModelForm prepopulatesteam.league а также представляет поле для представленияteam.draft_slot выглядеть как

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

Ответы на вопрос(1)

Решение Вопроса

рабочий ответ:

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=())}
 rantanplan25 окт. 2012 г., 22:58
@ Кола нетname поле на ваших моделях.
 rantanplan25 окт. 2012 г., 22:44
@Cole Хорошо, что 'хорошие новости! Я'Я пересмотрю код, чтобы отразить то, что вы сказали.
 rantanplan25 окт. 2012 г., 22:17
@cole Смотрите уточненный код выше. Обратите внимание наself.fields['draft_slot'].widget.choices, вместоself.fields['draft_slot'].choices, Скажи мне, если это работает.
 Cole25 окт. 2012 г., 22:41
Вы были очень близки! Это сработало после того, как я добавил следующую строку в класс Meta: widgets = {'draft_position»: Выбрать (choices = ())}
 Cole25 окт. 2012 г., 22:07
Я тщательно прошел через код. Если я установлю n = self.instance.league.number команд, я получу число, которое могу перебрать. Self.fields. ['draft_slot»]. Выборы не удаются. Я попытался установить его равным 1, (1,1) - (1,1), а также заданным кодом. Код не предоставляет классический выпадающий список вариантов при просмотре TeamModelForm. Все остальное выглядит отлично.
 Cole25 окт. 2012 г., 22:57
Проблема теперь в том, что team.name по какой-то причине установлено на имя лиги, а форма нет подтвердить.

Ваш ответ на вопрос