Как ограничить поле формы с внешним ключом на основе ранее выбранного поля?

Для предисловия я знаю, что есть несколько предыдущих сообщений об этом, но ответы ссылаются на использование сторонних пакетов, и мне интересно, есть ли решение с использованием ванильного Django, поскольку этим сообщениям уже несколько лет.

Я создаю приложение, основанное на музыке, в котором есть модели для исполнителей, альбомов и треков. Я хотел бы, чтобы при добавлении новых треков в панели администратора, если я выбираю исполнителя в форме, то выбор альбомов ограничивался только альбомами этого исполнителя, но не могу найти, как это сделать. Сначала я подумал, что мог бы использовать «__» для создания отношения, как в list_filter для модели администратора, но это не сработало.

Я добавил поле исполнителя в трек, пытаясь найти решение этой проблемы, но не уверен, что оно необходимо.

Я еще не разработал большинство видов для этого приложения, в настоящее время это только для панели администратора, чтобы добавить новые треки.

class Artist(models.Model):
    name = models.CharField(max_length=100, verbose_name="Artist")
    genre = models.CharField(max_length=100)
    country = CountryField(blank_label="(select country)")
    is_approved = models.BooleanField(default=False)

    def __str__(self):
        return self.name


class Album(models.Model):
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
    name = models.CharField(max_length=100, verbose_name="Album")
    release_date = models.DateField()
    is_approved = models.BooleanField(default=False)

    def __str__(self):
        return self.name


class Track(models.Model):
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE, verbose_name="Artist")
    album = models.ForeignKey(Album, on_delete=models.CASCADE, verbose_name="Album")
    listing_num = models.IntegerField(default=0)
    title = models.CharField(max_length=100)
    duration = models.CharField(max_length=10)
    spotify_link = models.CharField(max_length=256)
    apple_music_link = models.CharField(max_length=256)
    is_approved = models.BooleanField(default=False)

    def __str__(self):
        return self.title


class TrackForm(ModelForm):
    class Meta:
        model = Track
        fields = [
            "artist",
            "album",
            "listing_num",
            "title",
            "duration",
            "spotify_link",
            "apple_music_link",
        ]

Вот код для TrackAdmin:

class TrackAdmin(admin.ModelAdmin):
    model = Track
    list_display = [
        "artist",
        "album",
        "listing_num",
        "title",
        "duration",
        "is_approved",
    ]
    list_filter = ["album__name", "artist__name", "is_approved"]
Вернуться на верх