Django 内联模型管理过滤器外部字段

Posted

技术标签:

【中文标题】Django 内联模型管理过滤器外部字段【英文标题】:Django Inline Model Admin filter Foreign Field 【发布时间】:2013-08-20 17:26:01 【问题描述】:

我有以下问题。

我有 3 个模型:

class Deal(models.Model):
    name = models.CharField(max_length=80)

class Site(models.Model):
    name = models.CharField(max_length=80)
    deal = models.ForeignKey(Deal)

class Picture(models.Model):
    title = models.CharField(max_length=80)
    deal = models.ForeignKey(Deal)
    site = models.ForeignKey(Site)

我想使用 Site & Picture 内联管理模型制作 Deal Admin:

class SiteInline(admin.StackedInline):
    model = Site
    extra = 1


class PictureInline(admin.StackedInline):
    model = Picture
    extra = 1


class DealAdmin(admin.ModelAdmin):
    inlines = [
        SiteInline,
        PictureInline,
    ]

我想要做的是,当我在图片管理中选择站点时,它只显示我属于我正在查看的当前交易的网站(如果我正在更新 - 不是创建新的)。

我希望它在管理员中工作,我花了很多时间搜索网络但找不到任何有用的东西,请帮助!

我试图这样做,但我不知道如何访问父模型实例以获取交易 ID:

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):

    if db_field.name == 'site':
        kwargs['queryset'] = Site.objects.filter(deal__id=1)

    return super(PictureInline, self).formfield_for_foreignkey(db_field, request=None, **kwargs)

【问题讨论】:

【参考方案1】:

在 DTing 的变体中,我看到了问题 - self.instance.deal 设置为编辑模式,但未设置为添加模式

我认为,你应该写

try:        
    self.fields['site'].queryset = Site.objects.filter(deal=self.instance.deal)
except:
    self.fields['site'].queryset = Site.objects

改为

【讨论】:

【参考方案2】:

Django: accessing the model instance from within ModelAdmin?

class PictureInlineForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PictureInlineForm, self).__init__(*args, **kwargs)
        self.fields['site'].queryset = Site.objects.filter(
            deal=self.instance.deal)

class PictureInline(admin.ModelAdmin):
    form = PictureInlineForm

【讨论】:

class PictureInline(admin.ModelAdmin): 这是准确的吗?创建它并用图片注册它,没有结果,同时将form = PictureInlineForm 添加到class PictureInline(admin.StackedInline): 我们得到错误Picture has no deal.

以上是关于Django 内联模型管理过滤器外部字段的主要内容,如果未能解决你的问题,请参考以下文章

Django:过滤管理模板中的空模型条目

Django内联表单集通过另一个模型在多对多关系中过滤

如何在字段集中显示Django管理员内联模型?

如何在搜索栏中按布尔字段过滤 - django

尝试使用 django 过滤器为给定模型中的所有字段创建一般搜索

django基础知识之模型查询: