2017-02-01 4 views
2

J'ai un modèle que j'expose via modeladmin de Wagtail qui fonctionne jusqu'à ce que j'essaie d'appliquer un list_filter comprenant un ForeignKey. J'ai un modèle auto-référencé (pour stocker les comtés, villes et villages) appelé Région que j'aimerais pouvoir créer un filtre par le niveau Parent. J'utilise Wagtail 1.8.1 sur Django 1.10. Voici le modèle:Wagtail ModelAdmin avec l'erreur list_filter: FieldDoesNotExist: La région n'a pas de champ nommé 'p'

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, 
     ) 

Et le ModelAdmin de 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) 

Il fonctionne très bien si je commente la ligne list_filter dans la classe RegionAdmin. La documentation indique qu'il peut prendre un ForeignKey dans la liste. Est-ce que je manque quelque chose d'évident? La trace de pile est ici:

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' 

Merci pour toute aide ou des idées!

Répondre

3

Il vous manque une virgule:

list_filter = ('parent',) 

Sans la virgule, les parenthèses sont ignorées et django seront itérer la chaîne, et non un tuple (parce qu'il n'y a pas tuple!), D'où la tentative de champ d'accès p.

De l'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

Excusez-moi pendant que je vais me lancer pendant environ une heure! Je vous remercie. – FlipperPA

+1

Excusé, monsieur! ;-) Sois gentil! – schwobaseggl