0

我有 3 个模型团队、球员和夹具。

夹具

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。现在,在管理员中,在灯具下,“home_players”列出了所有球队的所有球员。

我是 django 管理应用程序的新手,但我如何只显示属于 home_team 的 home_players 和属于 away_teams 的 away_players?

谢谢

4

1 回答 1

2

要让您的away_players字段在您选择主队或客队时自动更新,您需要使用 JavaScript。

  1. 在 away_team 上监听 change 事件
  2. 发送视图选择并让它返回一个新列表以填充您的away_players字段。(检查get_urls以了解此代码可能存在的位置)

它绝对不支持开箱即用。

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

我认为最简单的解决方案是制作表格 2 阶段:

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

您还可以覆盖管理add视图以首先仅显示前两个字段。

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
于 2011-06-17T20:40:36.243 回答