Tag filter field for filter forms

This commit is contained in:
Saria Hajjar
2020-01-13 20:16:13 +00:00
parent a8d9fe799b
commit 2f28dec891
7 changed files with 101 additions and 7 deletions

View File

@@ -6,6 +6,7 @@ from io import StringIO
from django import forms
from django.conf import settings
from django.contrib.postgres.forms.jsonb import JSONField as _JSONField, InvalidJSONInput
from django.db.models import Count
from mptt.forms import TreeNodeMultipleChoiceField
from .constants import *
@@ -596,6 +597,22 @@ class SlugField(forms.SlugField):
self.widget.attrs['slug-source'] = slug_source
class TagFilterField(forms.MultipleChoiceField):
"""
A filter field for the tags of a model. Only the tags used by a model are displayed.
:param model: The model of the filter
"""
widget = StaticSelect2Multiple
def __init__(self, model, *args, **kwargs):
if hasattr(model, 'tags'):
tags = model.tags.annotate(count=Count('extras_taggeditem_items')).order_by('name')
choices = [(str(tag.slug), '{} ({})'.format(tag.name, tag.count)) for tag in tags]
super().__init__(label='Tags', choices=choices, required=False, *args, **kwargs)
class FilterChoiceIterator(forms.models.ModelChoiceIterator):
def __iter__(self):