Skip to content

Instantly share code, notes, and snippets.

@Guest007
Created August 25, 2020 10:51
Show Gist options
  • Save Guest007/b26710779ace07de6a97701921d65f1c to your computer and use it in GitHub Desktop.
Save Guest007/b26710779ace07de6a97701921d65f1c to your computer and use it in GitHub Desktop.
django admin filter for GenericForeignKey field
# https://djangosnippets.org/snippets/10564/
list_filter = [
'name',
get_generic_foreign_key_filter(
u'Filter Target',
content_type_id_field='target_ct',
object_id_field='target_id'
)
]
def get_generic_foreign_key_filter(title, parameter_name=u'', separator='-', content_type_id_field='content_type_id', object_id_field='object_id') :
class GenericForeignKeyFilter(SimpleListFilter):
def __init__(self, request, params, model, model_admin):
self.separator = separator
self.title = title
self.parameter_name = u'generic_foreign_key_' + parameter_name
super(GenericForeignKeyFilter, self).__init__(request, params, model, model_admin)
def lookups(self, request, model_admin):
variable_column = object_id_field
search_type = 'isnull'
filter = variable_column + '__' + search_type
qs = model_admin.model.objects.exclude(**{ filter: True })\
.order_by(content_type_id_field, object_id_field)\
.distinct(content_type_id_field, object_id_field)\
.values_list(content_type_id_field, object_id_field)
return [
(
'{1}{0.separator}{2}'.format(self, *content_type_and_obj_id_pair),
ContentType.objects
.get(id=content_type_and_obj_id_pair[0])
.model_class()
.objects.get(pk=content_type_and_obj_id_pair[1])
.__str__()
)
for content_type_and_obj_id_pair
in qs
]
def queryset(self, request, queryset):
try :
content_type_id, object_id = self.value().split(self.separator)
return queryset.filter(**({
content_type_id_field:content_type_id,
object_id_field:object_id
}))
except:
return queryset
return GenericForeignKeyFilter
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment