【问题标题】:Django Grapelli add autocomplete lookups on InlineAdminDjango Grappelli 在 Inline Admin 上添加自动完成查找
【发布时间】:2017-11-24 19:47:03
【问题描述】:

我有这 3 个模型:

class MyFile(models.Model):
    file = models.FileField(upload_to="files/%Y/%m/%d")

    def __unicode__(self):
        """."""
        return "%s" % (
            self.file.name)    

class ExampleModel(models.Model):
    attached_files =models.ManyToManyField(MyFile)
    main_model = models.ForeignKey(MainModel)    

class MainModel(models.Model):
    attached_files =models.ManyToManyField(MyFile)

还有我的admin.py如下:

class ExampleModelAdminInline(admin.TabularInline):
    model = ExampleModel
    extra = 2    

class MainModelAdmin(admin.ModelAdmin):
    inlines = [ExampleModelAdminInline]

我使用django-grapelli,因为它为多对多字段提供自动完成查找。但是,我不确定如何将此自动完成查找添加到 TabularInline 管理员。谁能解释我如何设置attached_files 字段以进行自动完成查找?

【问题讨论】:

  • 在您的MyFile 上写下您的两个attached_files 时,您想自动完成吗?
  • 是的,我想在字段 attach_files 上搜索 MyFile 对象以设置这些字段的引用。

标签: python django autocomplete django-grappelli


【解决方案1】:

首先,您需要在要搜索的Model 中设置静态方法autocomplete_search_fields(),在您的情况下为MyFile。从docs 我们得到:

class MyFile(models.Model):
    #your variable declaration...

    @staticmethod
    def autocomplete_search_fields():
        return ("id__iexact", "name__icontains",) #the fields you want here

你也可以定义GRAPPELLI_AUTOCOMPLETE_SEARCH_FIELDS而不是声明静态方法,比如:

GRAPPELLI_AUTOCOMPLETE_SEARCH_FIELDS = {
    "myapp": {
        "MyFile": ("id__iexact", "name__icontains",)
    }
}

然后你应该将查找和原始字段添加到你想要的admin 类,考虑到它的相关Model(比如你的ExampleModel),它是具有ManyToManyField 的那个。你也可以用类似的方式处理ForeignKey。也来自提到的文档:

class ExampleModel(models.Model):
    main_model = models.ForeignKey(MainModel) #some FK to other Model related
    attached_files =models.ManyToManyField(MyFile) #the one with static decl      

class MainModelAdmin(admin.ModelAdmin):
    #your variable declaration...

    # define raw fields
    raw_id_fields = ('main_model','attached_files',)
    # define the autocomplete_lookup_fields
    autocomplete_lookup_fields = {
        'fk': ['main_model'],
        'm2m': ['attached_files'],
    }

记住将关系的两端(您的模型)注册到您的admin.site,如下所示:

#the one with the m2m and the one with the lookup
admin.site.register(ExampleModel, MainModelAdmin) 

您也可以查看this问题以更好地理解。

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 2012-11-30
    • 2012-10-02
    • 2014-02-24
    • 2016-07-29
    • 2015-05-10
    • 2013-07-25
    • 2014-01-01
    相关资源
    最近更新 更多