@Jough Dempsey a souligné peut-être vous n'avez pas besoin FilterSpec sur commande seulement pour les champs de m2m. Cependant, aujourd'hui, j'ai trouvé que je voulais un pour un champ de tag django-taggit. Les balises sont fondamentalement une relation m2m mais elle se plaint de 'TaggableManager' object has no attribute 'get_choices'
si vous essayez d'ajouter le champ tag dans list_filter.
Dans ce cas, il était @ code de lazerscience à la rescousse ...
Cependant, il ne fonctionne pas lorsqu'il est utilisé contre Django 1.3, besoin d'un couple de nouvelles lignes ajoutées, comparez ma version ci-dessous qui fonctionne:
class TagFilterSpec(RelatedFilterSpec):
def __init__(self, f, request, params, model, model_admin, field_path=None):
super(RelatedFilterSpec, self).__init__(
f, request, params, model, model_admin, field_path=field_path)
self.lookup_title = f.verbose_name # use field name
self.lookup_kwarg = f.name
self.lookup_kwarg_isnull = '%s__isnull' % (self.field_path)
self._lookup_model = f.rel.to
self.lookup_val = request.GET.get(self.lookup_kwarg, None)
self.lookup_val_isnull = request.GET.get(
self.lookup_kwarg_isnull, None)
self.user = request.user
self.lookup_choices = [(g.pk, g.name) for g in Tag.objects.all()]
def has_output(self):
return len(self.lookup_choices) > 1
def title(self):
return self._lookup_model._meta.verbose_name
FilterSpec.filter_specs.insert(0,
(lambda f: f.rel.to == Tag, TagFilterSpec))
Qu'est-ce que "f" dans le code? Est-ce l'instance de photo? Le code enregistre GalleryFilterSpec pour un champ du modèle Photo, n'est-ce pas? Le modèle de photo ne comporte aucun champ associé à la galerie. Merci pour votre aide! –
Ma réponse était trop longue pour un commentaire, alors regardez la modification ci-dessus! –
Eh bien, "f" est le champ. On dirait que je devrais changer les modèles Galerie et Photo pour pouvoir filtrer les photos par galerie. L'exemple est génial de toute façon. Merci encore –