ForeignKeyAutocompleteAdmin
ForeignKeyAutocompleteAdmin
给定这两个模型:
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)
已完成 collectstatic 并在 INSTALLED_APPS 中声明了 django_extensions 和我的应用程序。为什么我得到这个:
[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输入)?
产品 table 有数百万行,默认的管理配置不能很好地处理这个问题,所以我尝试了扩展包解决方案。该小部件正在请求 product/foreignkey_autocomplete
但通过 manage.py show_urls 的快速 grep 显示只有 /orders 已注册到 foreignkeyautocomplete 包。我在文档中没有看到任何关于 url 配置的内容(我假设这是在向管理员注册时完成的)。我怎样才能让它工作?
部分解决方案:
在检查 urls 并意识到它试图将搜索查询发送到 /product/foreignkey_autocomplete/... 之后,我也尝试为该模型创建一个空的管理员。它有效,但行为仍然很奇怪。好像输入4-5个字符就停止搜索了,懒得刷新了
根据我的更新,为关系的另一端添加 ForeignKeyAutocompleteAdmin
创建了丢失的 url,功能似乎有效
@Verbal_Kint 我想我可能已经想到了和你一样的问题。
我有一个用于模型 Task 的 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_urls()
里面TestAdmin
然后,一切正常。
也许有更好的方法,但这确实解决了我的问题。希望这能有所帮助。
给定这两个模型:
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)
已完成 collectstatic 并在 INSTALLED_APPS 中声明了 django_extensions 和我的应用程序。为什么我得到这个:
[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输入)?
产品 table 有数百万行,默认的管理配置不能很好地处理这个问题,所以我尝试了扩展包解决方案。该小部件正在请求 product/foreignkey_autocomplete
但通过 manage.py show_urls 的快速 grep 显示只有 /orders 已注册到 foreignkeyautocomplete 包。我在文档中没有看到任何关于 url 配置的内容(我假设这是在向管理员注册时完成的)。我怎样才能让它工作?
部分解决方案:
在检查 urls 并意识到它试图将搜索查询发送到 /product/foreignkey_autocomplete/... 之后,我也尝试为该模型创建一个空的管理员。它有效,但行为仍然很奇怪。好像输入4-5个字符就停止搜索了,懒得刷新了
根据我的更新,为关系的另一端添加 ForeignKeyAutocompleteAdmin
创建了丢失的 url,功能似乎有效
@Verbal_Kint 我想我可能已经想到了和你一样的问题。
我有一个用于模型 Task 的 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_urls()
里面TestAdmin
然后,一切正常。
也许有更好的方法,但这确实解决了我的问题。希望这能有所帮助。