如何根据当前实例限制InlineAdmin中的选择?

2024-09-30 01:34:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个跨多个Django站点重用的文章数据库。在SiteArticle模型中还存储了每篇文章的一些特定于站点的信息。一点信息是每个SiteArticle的站点特定标签列表。以下是models.py

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]

编辑文章时,我希望内联站点文章表单仅显示相关站点的标签。我试图重写formfield_for_manytomany()方法,但在这里我无法访问筛选queryset所需的instance变量(该变量应为当前SiteArticle的实例):

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对象的实例。我怎样才能解决这个问题

编辑——我已经发现,get_formset()确实得到了一个传入的实例。但是,此实例是一篇文章,而不是筛选queryset所需的SiteArticle


Tags: 实例name编辑modeladmin站点models文章
1条回答
网友
1楼 · 发布于 2024-09-30 01:34:46

这是我自己找到的答案。请随意编辑、评论或提供更好的解决方案

我创建了一个用于编辑SiteArticles的自定义表单,我使用ModelAdmin的form选项将其传递给ArticleAdmin。在这个表单的构造函数中,我根据当前模型实例对queryset进行了过滤,该实例现在可以作为self.instance使用

class CustomSiteArticleForm(forms.ModelForm):
    class Meta:
        model = SiteArticle
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(CustomSiteArticleForm, self).__init__(*args, **kwargs)
        if self.instance.pk:
            self.fields['tags'].queryset = self.instance.site.tags.all()
        else:
            self.fields['tags'].queryset = Tag.objects.none()

相关问题 更多 >

    热门问题