django 模型形式,根据 ForeignKey 模型中的值限制选择 [英] django model form, restrict choices based on value in ForeignKey model

查看:19
本文介绍了django 模型形式,根据 ForeignKey 模型中的值限制选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个模型:LeagueTeam.Team 有一个到 League 的外键链接.我希望能够根据存储在 League 中的值为 Team 设置可用的选项.具体:

I have two models: League and Team. Team has a foreign key link to League. I want to be able to set choices available for the Team based on values stored in League. Specifically:

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(?????????)])

我认识到我无法在 Team 模型中准确定义我的 draft_slot.choices.所以我希望像这样设置 Team:

I recognize I cannot accurately define my draft_slot.choices in the Team model. So I would expect to set up Team like so:

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

我已经建立了一个TeamModelForm:

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

我需要什么 foo 才能使用 league.idleague.number_of_teams 所以 TeamModelForm 的视图预填充 team.league 并渲染一个字段来表示 team.draft_slot 看起来像

What foo do I need in order to use league.id, league.number_of_teams so the view of TeamModelForm prepopulates team.league and also renders a field to represent team.draft_slot to look like

draft_slot = models.IntegerField(choices=[(i+1,i+1) for i in range(league.number_of_teams+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=())}

这篇关于django 模型形式,根据 ForeignKey 模型中的值限制选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆