Django管理员,限制ManyToManyField中显示的数据



我有三个模型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。

  1. 收听away_team上的更改事件
  2. 向视图发送所选内容,并让其返回一个新列表以填充您的away_players字段。(请检查get_urls以了解此代码可能所在的位置)

它肯定没有开箱即用的支持。

通常,要过滤m2m字段或外键上的结果,可以使用formfield_for_manytomany,但它无法访问正在编辑的对象,所以我认为通过这种方法是不可能的。

我认为最简单的解决方案是进行中二阶段:

  1. 填写主场/客场
  2. 保存模型
  3. 填写主客场球员

您也可以覆盖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

相关内容

  • 没有找到相关文章

最新更新