2017-02-01 12 views
2

У меня есть модель, которую я просматриваю через Wagtail's modeladmin, которая работает до тех пор, пока я не попытаюсь применить list_filter, включая ForeignKey. У меня есть модель саморегуляции (для хранения графств, городов и городов), называемая Region, что я хотел бы создать фильтр на уровне Parent.Wagtail ModelAdmin с ошибкой list_filter: FieldDoesNotExist: У области нет поля с именем 'p'

Я бегу Wagtail 1.8.1 на Django 1.10. Вот модель:

class Region(models.Model): 
    """ 
    Tree of regions and sub-regions. 
    """ 

    name = models.CharField(max_length=255) 
    parent = models.ForeignKey(
     'Region', 
     blank=True, 
     null=True, 
    ) 

    class Meta: 
     unique_together = ('name', 'parent') 

    def __str__(self): 
     return '{0}'.format(
      self.name, 
     ) 

И ModelAdmin из wagtail_hooks.py:

class RegionAdmin(ModelAdmin): 
    model = Region 
    menu_icon = 'doc-full-inverse' 
    empty_value_display = 'ROOT' 
    list_display = ('parent', 'name') 
    list_filter = ('parent') 


modeladmin_register(RegionAdmin) 

Он отлично работает, если я закомментировать list_filter линию в классе RegionAdmin. В документации говорится, что в списке может принимать ForeignKey. Мне что-то не хватает? Трассировка стека находится здесь:

Traceback (most recent call last): 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/core/handlers/exception.py", line 39, in inner 
    response = get_response(request) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/views/decorators/cache.py", line 43, in _cache_controlled 
    response = viewfunc(request, *args, **kw) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/wagtail/wagtailadmin/decorators.py", line 24, in decorated_view 
    return view_func(request, *args, **kwargs) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/wagtail/contrib/modeladmin/options.py", line 350, in index_view 
    return view_class.as_view(**kwargs)(request) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/views/generic/base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/utils/decorators.py", line 67, in _wrapper 
    return bound_func(*args, **kwargs) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/utils/decorators.py", line 63, in bound_func 
    return func.__get__(self, type(self))(*args2, **kwargs2) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/wagtail/contrib/modeladmin/views.py", line 249, in dispatch 
    self.queryset = self.get_queryset(request) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/wagtail/contrib/modeladmin/views.py", line 554, in get_queryset 
    filters_use_distinct) = self.get_filters(request) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/wagtail/contrib/modeladmin/views.py", line 381, in get_filters 
    field_path)[-1] 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/contrib/admin/utils.py", line 485, in get_fields_from_path 
    fields.append(parent._meta.get_field(piece)) 
    File "/home/vagrant/.virtualenvs/sepia/lib/python3.5/site-packages/django/db/models/options.py", line 619, in get_field 
    raise FieldDoesNotExist('%s has no field named %r' % (self.object_name, field_name)) 
django.core.exceptions.FieldDoesNotExist: Region has no field named 'p' 

Спасибо за любую помощь или идеи!

ответ

3

Вы пропускаете запятую:

list_filter = ('parent',) 

Без запятой, скобки, игнорируется и Джанго будет перебор строки, а не кортеж (так как нет кортежа!), Поэтому попытка поле доступа p.

От docs:

a tuple with one item is constructed by following a value with a comma (it is not sufficient to enclose a single value in parentheses). Ugly, but effective.

+0

Простите меня, пока я иду пинать себя в течение часа! Спасибо. – FlipperPA

+1

Извините, сэр! ;-) Быть нежным! – schwobaseggl