Администратор Django, ограничение данных, отображаемых внутри ManyToManyField - PullRequest
0 голосов
/ 17 июня 2011

У меня есть 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) 

Как видите, игрок принадлежит к команде. Fixture в качестве home_team, away_team, home_players и away_players. Теперь в рамках админа под «светильниками» «home_players» перечисляет ВСЕХ игроков из всех команд.

Я новичок в админ-приложении django, но как бы мне показать home_players, принадлежащих home_team, и away_players, принадлежащих away_teams?

Спасибо

1 Ответ

2 голосов
/ 18 июня 2011

Чтобы ваше поле away_players автоматически обновлялось, когда вы выбираете домашнюю или выездную команду, вам нужно будет использовать JavasScript.

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