2017-05-11 2 views
1

Filtrage avec django-filter avec un AllValuesFilter sur un grand nombre à plusieurs champs et d'afficher ce via LinkWidget, je ne reçois pas une option de filtre All, comme le django admin list_filter.django-filtre: ajouter « All » option de filtre pour AllValuesFilter avec LinkWidget

J'ai trouvé Add Any & None Handling to ChoiceFilter (and subclasses) et diverses autres questions connexes, mais je ne comprends pas la solution ...

Dans ce cas précis, je suis le filtrage sur les catégories pour un modèle Django WagtailPage:

# models.py 

# wagtail imports 
# ... 
# modelcluster imports, eg. 
# from modelcluster.fields import ParentalKey, ParentalManyToManyField 

class CategoryRegion(models.Model): 
    title = models.CharField(max_length=200,) 

class NewsPage(Page): 
    categories_region = ParentalManyToManyField(
     "core.CategoryRegion", 
     blank=True, 
    ) 

-

# filters.py 

import django_filters 
from django_filters.widgets import LinkWidget 

class NewsFilter(django_filters.FilterSet): 

    categories_region = django_filters.AllValuesFilter(
     name="categories_region__title", 
     label="Categories: Region", 
     widget=LinkWidget(), 
    ) 

    class Meta: 
     model = NewsPage 
     fields = ['categories_region',] 

Tous les conseils?

+0

Je vous suggère d'essayer de reproduire cela sur un nouveau projet (non Bergeronnette) en utilisant une plaine 'ManyToManyField' plutôt qu'un' ParentalManyToManyField'. Les types de champs de Modelcluster reposent sur des internes de Django obscurs et pas entièrement stables, ce qui aidera à déterminer si ces défauts de Modelcluster sont à blâmer, ou s'il s'agit d'un problème de 'django-filter' pur (auquel cas je ne peux pas aider , mais j'espère que quelqu'un d'autre le fera ...) – gasman

+0

Ok, je vais essayer ça. Fait intéressant, en accrochant un 'ModelAdmin' sur ce modèle de page et en définissant' categories_region' en tant que 'list_filter', j'obtiendrai l'option' All' dans ce 'ModelAdmin'. – tombreit

Répondre

2

Il existe un bugAllValuesFilter n'a pas une option tout/n'importe. #680 devrait résoudre le problème, mais il est actuellement non fusionné. En attendant, vous devriez être capable d'installer la branche associée pour le PR, ou créer une sous-classe personnalisée qui ajoute l'option "Tous". Quelque chose comme:

class ActuallyAllValuesFilter(django_filters.AllValuesFilter): 

    @property 
    def field(self): 
     f = super(ActuallyAllValuesFilter, self).field 
     f.choices = [('', 'All')] + f.choices 
     return f