Guest User

Untitled

a guest
May 24th, 2016
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. from django.views import generic
  2.  
  3.  
  4. class SearchableListView(generic.ListView):
  5. model = None
  6. template_name = None
  7. search_form_class = None
  8. override_fields = {}
  9. queryset_distinct = None
  10. order_by = None
  11.  
  12. def get_search_form(self):
  13. return self.search_form_class() if self.search_form_class else None
  14.  
  15. def initialize_form(self):
  16. form = self.get_search_form()
  17. fields = self.get_search_fields()
  18. search_query = self.request.GET
  19.  
  20. if search_query:
  21. for field in fields:
  22. if field in search_query and len(search_query[field]) > 0:
  23. form.fields[field].initial = search_query[field]
  24. return form
  25.  
  26. def get_search_fields(self):
  27. try:
  28. form = self.get_search_form()
  29. searchable_fields = [name for name, fields in form.fields.items()]
  30. except:
  31. searchable_fields = []
  32. return searchable_fields
  33.  
  34. def filter_queryset(self):
  35. fields = self.get_search_fields()
  36. filters = {}
  37. form = self.get_search_form()
  38.  
  39. for field in fields:
  40. if field in self.request.GET and len(self.request.GET[field]) > 0:
  41. if field in self.override_fields:
  42. if type(self.override_fields[field]) == list:
  43. for item in self.override_fields[field]:
  44. filters[item] = form.fields[field].clean(
  45. self.request.GET.get(field))
  46. else:
  47. overrided_field = self.override_fields[field]
  48. try:
  49. data = form.fields[field].clean(
  50. self.request.GET.get(field))
  51. except:
  52. data = self.request.GET.get(field)
  53. filters[overrided_field] = data
  54. else:
  55. filters[field] = form.fields[field].clean(
  56. self.request.GET.get(field))
  57.  
  58. return filters
  59.  
  60. def get_queryset(self):
  61. filters = self.filter_queryset()
  62. queryset = super(SearchableListView, self).get_queryset()
  63. if filters:
  64. queryset = queryset.filter(**filters)
  65. if self.order_by:
  66. queryset = queryset.order_by(*self.order_by)
  67. if self.queryset_distinct:
  68. queryset = queryset.distinct()
  69. return queryset
  70.  
  71. def get_context_data(self, **kwargs):
  72. context = super(SearchableListView, self).get_context_data(**kwargs)
  73. context['search_form'] = self.initialize_form()
  74. return context
Add Comment
Please, Sign In to add comment