Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from django.views import generic
- class SearchableListView(generic.ListView):
- model = None
- template_name = None
- search_form_class = None
- override_fields = {}
- queryset_distinct = None
- order_by = None
- def get_search_form(self):
- return self.search_form_class() if self.search_form_class else None
- def initialize_form(self):
- form = self.get_search_form()
- fields = self.get_search_fields()
- search_query = self.request.GET
- if search_query:
- for field in fields:
- if field in search_query and len(search_query[field]) > 0:
- form.fields[field].initial = search_query[field]
- return form
- def get_search_fields(self):
- try:
- form = self.get_search_form()
- searchable_fields = [name for name, fields in form.fields.items()]
- except:
- searchable_fields = []
- return searchable_fields
- def filter_queryset(self):
- fields = self.get_search_fields()
- filters = {}
- form = self.get_search_form()
- for field in fields:
- if field in self.request.GET and len(self.request.GET[field]) > 0:
- if field in self.override_fields:
- if type(self.override_fields[field]) == list:
- for item in self.override_fields[field]:
- filters[item] = form.fields[field].clean(
- self.request.GET.get(field))
- else:
- overrided_field = self.override_fields[field]
- try:
- data = form.fields[field].clean(
- self.request.GET.get(field))
- except:
- data = self.request.GET.get(field)
- filters[overrided_field] = data
- else:
- filters[field] = form.fields[field].clean(
- self.request.GET.get(field))
- return filters
- def get_queryset(self):
- filters = self.filter_queryset()
- queryset = super(SearchableListView, self).get_queryset()
- if filters:
- queryset = queryset.filter(**filters)
- if self.order_by:
- queryset = queryset.order_by(*self.order_by)
- if self.queryset_distinct:
- queryset = queryset.distinct()
- return queryset
- def get_context_data(self, **kwargs):
- context = super(SearchableListView, self).get_context_data(**kwargs)
- context['search_form'] = self.initialize_form()
- return context
Add Comment
Please, Sign In to add comment