123456789101112131415161718192021222324252627282930313233343536 |
- from django.contrib.admin import RelatedFieldListFilter
- from django.contrib.admin.utils import get_model_from_relation
- from django.core.urlresolvers import reverse
- from django.forms.utils import flatatt
- from django.utils.encoding import smart_text
- from django.utils.html import format_html
- class RelatedFieldAjaxListFilter(RelatedFieldListFilter):
- ajax_attrs = None
- def has_output(self):
- return True
- def field_choices(self, field, request, model_admin):
- app_label = field.related_model._meta.app_label
- model_name = field.related_model._meta.object_name
- self.ajax_attrs = format_html('{}', flatatt({
- 'data-app-label': app_label,
- 'data-model': model_name,
- 'data-ajax--url': reverse('jet:model_lookup'),
- 'data-queryset--lookup': self.lookup_kwarg
- }))
- if self.lookup_val is None:
- return []
- other_model = get_model_from_relation(field)
- if hasattr(field, 'rel'):
- rel_name = field.rel.get_related_field().name
- else:
- rel_name = other_model._meta.pk.name
- queryset = field.related_model._default_manager.filter(**{rel_name: self.lookup_val}).all()
- return [(x._get_pk_val(), smart_text(x)) for x in queryset]
|