我有三个模型Team、Player和Fixture。
固定装置
class Fixture(models.Model):
"""(Fixture description)"""
home = models.ForeignKey(Team, related_name="home_games")
away = models.ForeignKey(Team, related_name="away_games")
home_players = models.ManyToManyField(Player, related_name="home_games")
away_players = models.ManyToManyField(Player, related_name="away_games")
class Player(models.Model):
"""(Player description)"""
surname = models.CharField(blank=True, max_length=255)
forename = models.CharField(blank=True, max_length=255)
number = models.IntegerField(blank=True, null=True)
team = models.ForeignKey(Team, related_name="players")
class Team(models.Model):
"""(Team description)"""
name = models.CharField(blank=True, max_length=255)
location = models.CharField(blank=True, max_length=255)
正如你所看到的,一个球员属于一个团队。固定装置作为home_team、away_team、home_players和away_players。现在,在管理员的fixture下,"home_players"列出了所有球队的所有球员。
我对django管理应用程序有点陌生,但我该如何显示属于home_team的home_players和属于away_teams的away_players?
感谢
要在选择主队或客场球队时自动更新away_players
字段,您需要使用JavasScript。
- 收听away_team上的更改事件
- 向视图发送所选内容,并让其返回一个新列表以填充您的
away_players
字段。(请检查get_urls以了解此代码可能所在的位置)
它肯定没有开箱即用的支持。
通常,要过滤m2m字段或外键上的结果,可以使用formfield_for_manytomany
,但它无法访问正在编辑的对象,所以我认为通过这种方法是不可能的。
我认为最简单的解决方案是进行中二阶段:
- 填写主场/客场
- 保存模型
- 填写主客场球员
您也可以覆盖adminadd
视图,以便一开始只显示前两个字段。
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
# make sure we're editing a saved model
if self.instance.id:
self.fields['home_players'].queryset = Player.objects.filter(team=self.instance.home)
self.fields['away_players'].queryset = Player.objects.filter(team=self.instance.away)
class Meta:
model = Fixture
class MyAdmin(admin.ModelAdmin):
form = MyForm