【问题标题】:Django admin, limiting what data is being displayed inside a ManyToManyFieldDjango 管理员,限制在 ManyToManyField 中显示的数据
【发布时间】:2011-06-17 19:45:05
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您应该真正粘贴您注册的 ModelAdmin 类,这样我们就可以知道您是如何尝试显示 Fixture 对象的。
  • admin 类只是标准类,admin.site.register(Fixture)

标签: python django many-to-many manytomanyfield


【解决方案1】:

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

  1. 收听 away_team 上的更改事件
  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

【讨论】:

  • 在我发布这个之后,我想home_players 在我保存模型之前将不可用。该方法效果很好,如果我们正在编辑表格,则会显示正确的玩家。如果记录是新记录,是否可以隐藏home_playersaway_players
  • 您可以尝试覆盖ModelAdmin.add_view 并将self.form 动态设置为没有m2m 字段的表单。然后,确保在您的 change_view 中,将 self.form 设置为“真实”表单。
猜你喜欢
  • 1970-01-01
  • 2013-03-17
  • 2010-09-14
  • 2012-01-04
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2010-11-21
相关资源
最近更新 更多