Django admin: исключение значений из выпадающего списка с сохранением существующего значения
У меня есть сайт с рейтингами конференций, где FoR-коды являются одним из полей. В базе данных есть старые коды FoR, которые больше не используются. Я хотел бы исключить эти коды из выпадающего меню формы изменений на сайте администратора, поскольку для того, чтобы добраться до текущих кодов, требуется прокрутка (скриншот).
Я попробовал исключить старые коды, переопределив formfield_for_foreignkey
, как показано в приведенном ниже фрагменте кода. Однако если в админке открыть запись конференции со старым кодом, то выпадающий список кодов FoR очищается (скриншот).
Можно ли исключить старые коды FoR, сохранив при этом код FoR для старых записей? В примере, на который я ссылался выше (1, 2), я хочу сохранить код 0905 для старой записи, а для новых записей показывать только текущие коды.
#admin.py
class RankInline(admin.TabularInline):
model = Rank
extra = 1
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "for":
kwargs["queryset"] = ForCode.objects.filter(code__startswith="46")
return super(RankInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
class CommentInLine(admin.TabularInline):
model = Comment
extra = 0
class ConferenceAdmin(admin.ModelAdmin):
list_display = ("acronym", "title", "url")
list_display_links = ("acronym", "title", "url")
search_fields = ("acronym", "title", "url")
inlines = (RankInline, CommentInLine)
#models.py
class ForCode(models.Model):
code = models.CharField(max_length=6, primary_key=True)
name = models.TextField()
source = models.ForeignKey(Source, on_delete=models.CASCADE)
class Rank(models.Model):
conference = models.ForeignKey(Conference, on_delete=models.CASCADE)
source = models.ForeignKey(Source, on_delete=models.CASCADE)
rank = models.CharField(max_length=255)
for_code = models.ForeignKey(ForCode, db_column="for", null=True, blank=True, on_delete=models.SET_NULL)