Django 外键自动完成管理

Django 外键自动完成管理,django,django-admin,django-extensions,Django,Django Admin,Django Extensions,鉴于这两种模式: class Product(Model): upc = CharField(max_length=96, unique=True) ... class Meta: app_label = 'scrapers' class Order(Model): ... product = ForeignKey('scrapers.Product', related_name='orders', on_delete=models.CA

鉴于这两种模式:

class Product(Model):
    upc = CharField(max_length=96, unique=True)
    ...
    class Meta:
        app_label = 'scrapers'

class Order(Model):
    ...
    product = ForeignKey('scrapers.Product', related_name='orders', on_delete=models.CASCADE)
    objects = OrderManager()

    class Meta:
        app_label = 'scrapers'
这个admin.py:

class OrderAdmin(ForeignKeyAutocompleteAdmin):
    related_search_fields = {
        'product': ('upc', 'retailer_offerings__name')
    }
    fields = ('product', 'client', 'completed', 'expires', 'amount', 'filled')


admin.site.register(Order, OrderAdmin)
在已安装的应用程序中完成静态和声明的django_扩展和我的应用程序。为什么我会得到这个:

[04/Dec/2016 05:54:28] "GET /admin/scrapers/product/foreignkey_autocomplete/?search_fields=upc&app_label=scrapers&model_name=product&q=045496 HTTP/1.1" 302 0
Not Found: /admin/scrapers/product/foreignkey_autocomplete/change/
[04/Dec/2016 05:54:28] "GET /admin/scrapers/product/foreignkey_autocomplete/change/ HTTP/1.1" 404 1875
输入到输入字段时(左边的框不是右边的pk输入)

Product表有数百万行,默认的管理员配置不能很好地处理这一问题,所以我尝试了extensions包解决方案。小部件正在请求
product/foreignkey\u autocomplete
,但通过manage.py show\u URL的快速grep显示,只有/orders已注册到foreignkey autocomplete包。我在文档寻址url配置中没有看到任何内容(我假设这是在向管理员注册时完成的)。我怎样才能让它工作

部分解决方案:


检查URL并意识到它正在尝试将搜索查询发送到/product/foreignkey\u autocomplete/。。。我还试图为该模型创建一个空的管理员。它奏效了,但行为仍然很奇怪。输入4-5个字符后,它似乎停止搜索,不需要刷新。

根据我的更新,为关系的另一端添加了一个
ForeignKeyAutocompleteAdmin
,创建了丢失的URL,并且功能似乎正常运行。

@Verbal\n我想我可能已经解决了与您相同的问题

对于模型任务,我有一个InlineModelAdmin“TaskInline”,其中的一个字段“SCRIPT”是模型TestScript的外键(由“TestAdmin”管理)

在我确保相关模型的ModelAdmin(这里是TestAdmin)继承ForeignKeyAutoCompleteAdmin而不是admin.ModelAdmin之后,然后确保TestAdmin有一个方法包装,如下所示:

class TestAdmin(ForeignKeyAutocompleteAdmin):

    ForeignKeyAutocompleteAdmin.model = TestScript

    def wrap(self, view):
        def wrapper(*args, **kwargs):
            return self.admin_site.admin_view(view)(*args, **kwargs)
        wrapper.model_admin = self
        return update_wrapper(wrapper, view)

    def get_urls(self):
        info = self.model._meta.app_label, self.model._meta.model_name

        urlpatterns = super(TestAdmin, self).get_urls()
        urlpatterns.insert(0, url(r'^(.+)/run/', self.wrap(self.run_view), name='%s_%s_run' % info))
        urlpatterns.insert(0, url(r'^add/$', self.wrap(self.add_view), name='%s_%s_add' % info))
        urlpatterns.insert(0, url(r'^add_to_template_mission/$', self.wrap(self.add_to_template_mission_view), name='%s_%s_add_to_template_mission' % info))
        urlpatterns.insert(0, url(r'^add_to_mission/$', self.wrap(self.add_to_mission_view), name='%s_%s_add_to_mission' % info))
        urlpatterns.insert(0, url(r'^$', self.wrap(self.changelist_view), name='%s_%s_changelist' % info))

        return urlpatterns

class TaskInline(ForeignKeyAutocompleteTabularInline):

    model = Task

    related_search_fields = {
        'SCRIPT': ('FILENAME', 'FILE_PATH', 'FILE_CONTENT', ),
    }
还有,别忘了

urlpatterns = super(TestAdmin, self).get_urls()
get_url()
inside
TestAdmin

然后,一切都很顺利


也许有更好的办法,但这确实解决了我的问题。希望这能有所帮助

谢谢,@verball\u Kint。这真让人恼火。为什么不在文件里?