2016-12-04 6 views
2

Учитывая эти две модели: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 и объявил django_extensions и мое приложение в INSTALLED_APPS. Почему я получаю это:

[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/foreignkey_autocomplete, но быстрый grep через manage.py show_urls показывает, что только пакет заказов был зарегистрирован в пакете foreignkeyautocomplete. Я ничего не вижу в документации по настройке URL-адресов (я предполагаю, что это делается при регистрации с администратором). Как я могу заставить это работать?

Частичное решение:

после изучения URLs и понимая, что пытается сверху отправить поисковые запросы/продукта/foreignkey_autocomplete/... Я попытался создать пустую администратора для этой модели, а также. Он работал, но поведение по-прежнему нечетное. Кажется, что он прекратил поиск после ввода 4-5 символов и не беспокоит обновление.

ответ

2

согласно моему обновление, добавление ForeignKeyAutocompleteAdmin для другой стороны отношения создали недостающие URLs и функциональность, кажется, работает

+1

Спасибо, @Verbal_Kint. Это безумие. Почему это не в документах? – xnx

0

@Verbal_Kint Я думаю, что я, возможно, понял, тот же вопрос, как ваша.

У меня есть 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

Тогда все стало работать нормально.

Возможно, есть лучший способ, но это решило мою проблему. Надеюсь, это поможет.