Как ограничить поле формы с внешним ключом на основе ранее выбранного поля?
Для предисловия я знаю, что есть несколько предыдущих сообщений об этом, но ответы ссылаются на использование сторонних пакетов, и мне интересно, есть ли решение с использованием ванильного 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"]