У меня есть база данных статей, которые повторно используются на нескольких сайтах Django. Для каждой статьи также имеется определенная информация по конкретному сайту, хранящаяся в модели SiteArticle. Один бит информации - это список тегов, специфичных для сайта, для каждой SiteArticle. Вот models.py
:Как ограничить выбор в InlineAdmin на основе текущего экземпляра?
class Article(models.Model):
sites = models.ManyToManyField(Site, through='SiteArticle')
class SiteArticle(models.Model):
site = models.ForeignKey(Site)
article = models.ForeignKey(Entiteit)
tags = models.ManyToManyField('Tag', blank=True)
class Tag(models.Model):
name = models.CharField(max_length=255)
site = models.ForeignKey(Site, related_name='tags')
Я использую встроенный администратора для редактирования и добавления SiteArticle объектов каждой статьи. Вот admin.py
:
class InlineSiteArticle(admin.StackedInline):
model = SiteArticle
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
inlines = [InlineSiteArticle]
При редактировании статьи, я хотел бы форму рядного SiteArticle к только отображения тегов соответствующего сайта. Я попытался переопределение метода formfield_for_manytomany(), но здесь я не имею доступа к instance
переменной (который должен быть экземпляром текущего SiteArticle), что мне нужно фильтровать QuerySet:
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "tags":
kwargs["queryset"] = instance.site.tags.all()
^^^^^^^^
return super(InlineSiteArticle, self).formfield_for_manytomany(db_field, request, **kwargs)
я уже смотрел на this Stack Overflow answer, который решает очень связанную проблему. Однако в моем случае мне не нужен доступ к «родительскому» экземпляру, а просто к экземпляру объекта SiteArticle текущей формы. Как я могу это решить?
EDIT - Я уже понял, что get_formset()делает получить экземпляр передается в Тем не менее, этот экземпляр является статья, не SiteArticle нужно фильтровать QuerySet..