vkk.generic.views
A collection of of reusable and extendable view classes.
1""" 2A collection of of reusable and extendable view classes. 3""" 4 5from functools import reduce 6from django.views.generic import ( 7 DetailView, CreateView, UpdateView, DeleteView, ListView, TemplateView 8) 9from django.db.models import Q 10from django.http import JsonResponse 11from django.core.exceptions import ImproperlyConfigured 12from django.utils.translation import gettext_lazy as _ 13from .mixins import OnSuccessMixin 14from .forms import FilterForm 15 16 17class CustomDetailView(DetailView): 18 """ 19 A generic view class providing customized version of the `DetailView` class. 20 """ 21 fields = None 22 action_options = {'update': _('Update'), 'delete': _('Delete')} 23 template_name = 'vkk/generic/details.html' 24 25 26class CustomCreateView(OnSuccessMixin, CreateView): 27 """ 28 A generic view class providing customized version of the `CreateView` class. 29 """ 30 on_success = 'create_success' 31 template_name = 'vkk/generic/create.html' 32 33 34class CustomUpdateView(OnSuccessMixin, UpdateView): 35 """ 36 A generic view class providing customized version of the `UpdateView` class. 37 """ 38 on_success = 'update_success' 39 template_name = 'vkk/generic/update.html' 40 drop_key = 'pk' 41 42 43class CustomDeleteView(OnSuccessMixin, DeleteView): 44 """ 45 A generic view class providing customized version of the `DeleteView` class. 46 """ 47 on_success = 'delete_success' 48 template_name = 'vkk/generic/delete.html' 49 drop_key = 'pk' 50 51 52class CustomSuccessView(OnSuccessMixin, TemplateView): 53 """ 54 A generic view class offering some functionality for successful actions. 55 """ 56 model = None 57 on_success = 'default' 58 59 60class CustomListView(ListView): 61 """ 62 A generic view class providing customized and extended version of the 63 `ListView` class. 64 """ 65 keys = None 66 fields = None 67 paginate_by = 25 68 action_options = {'update': _('Update'), 'delete': _('Delete')} 69 template_name = 'vkk/generic/list.html' 70 71 72class CustomFilterView(CustomListView): 73 """ 74 A generic view class extending `CustomListView` with added functionality 75 for filtering objects. 76 """ 77 template_name = 'vkk/generic/filter.html' 78 filter_fields = None 79 80 def get_filter_fields(self): 81 """ 82 Returns a list of fields associated with object model used for filtering. 83 """ 84 if self.filter_fields is not None: 85 return self.filter_fields 86 elif self.fields is not None and self.fields != '__all__': 87 return self.fields 88 elif self.fields is None: 89 raise ImproperlyConfigured( 90 'filter_fields or fields not specified.') 91 elif self.fields == '__all__': 92 raise ImproperlyConfigured( 93 "'__all__' not allowed (for security reasons).") 94 95 def get_filter(self): 96 """ 97 Returns a list of arguments for the filter()-method on a manager. 98 """ 99 filter_fields = self.get_filter_fields() 100 form = FilterForm(self.request.GET) 101 if form.is_valid(): 102 parameters = form.cleaned_data['query'].split() 103 else: 104 parameters = [] 105 if parameters: 106 qs = ( 107 Q( 108 **{field + '__icontains': str(param)} 109 ) for field in filter_fields for param in parameters 110 ) 111 query_filter = reduce(lambda q1, q2: q1 | q2, qs) 112 else: 113 query_filter = ~Q(pk=None) 114 return query_filter 115 116 def get_queryset(self): 117 """ 118 Returns a filtered queryset. 119 """ 120 return super().get_queryset().filter(self.get_filter()) 121 122 def get(self, request, *args, **kwargs): 123 if request.content_type == 'application/json': 124 query_values = self.get_queryset().values( 125 *self.get_filter_fields() 126 ) 127 suggestions = [' '.join( 128 (str(val) for val in obj.values()) 129 ) for obj in query_values] 130 return JsonResponse({'suggestions': suggestions}) 131 else: 132 return super().get(request) 133 134 def get_context_data(self, **kwargs): 135 context = super().get_context_data(**kwargs) 136 context["filter_form"] = FilterForm() 137 return context
18class CustomDetailView(DetailView): 19 """ 20 A generic view class providing customized version of the `DetailView` class. 21 """ 22 fields = None 23 action_options = {'update': _('Update'), 'delete': _('Delete')} 24 template_name = 'vkk/generic/details.html'
A generic view class providing customized version of the DetailView
class.
Inherited Members
- django.views.generic.base.View
- View
- http_method_names
- view_is_async
- as_view
- setup
- dispatch
- http_method_not_allowed
- options
- django.views.generic.detail.SingleObjectTemplateResponseMixin
- template_name_field
- template_name_suffix
- get_template_names
- django.views.generic.base.TemplateResponseMixin
- template_engine
- response_class
- content_type
- render_to_response
- django.views.generic.detail.BaseDetailView
- get
- django.views.generic.detail.SingleObjectMixin
- model
- queryset
- slug_field
- context_object_name
- slug_url_kwarg
- pk_url_kwarg
- query_pk_and_slug
- get_object
- get_queryset
- get_slug_field
- get_context_object_name
- get_context_data
- django.views.generic.base.ContextMixin
- extra_context
27class CustomCreateView(OnSuccessMixin, CreateView): 28 """ 29 A generic view class providing customized version of the `CreateView` class. 30 """ 31 on_success = 'create_success' 32 template_name = 'vkk/generic/create.html'
A generic view class providing customized version of the CreateView
class.
Inherited Members
- django.views.generic.base.View
- View
- http_method_names
- view_is_async
- as_view
- setup
- dispatch
- http_method_not_allowed
- options
- django.views.generic.edit.CreateView
- template_name_suffix
- django.views.generic.detail.SingleObjectTemplateResponseMixin
- template_name_field
- get_template_names
- django.views.generic.base.TemplateResponseMixin
- template_engine
- response_class
- content_type
- render_to_response
- django.views.generic.edit.BaseCreateView
- get
- post
- django.views.generic.edit.ModelFormMixin
- fields
- get_form_class
- get_form_kwargs
- form_valid
- django.views.generic.edit.FormMixin
- initial
- form_class
- success_url
- prefix
- get_initial
- get_prefix
- get_form
- form_invalid
- get_context_data
- django.views.generic.detail.SingleObjectMixin
- model
- queryset
- slug_field
- context_object_name
- slug_url_kwarg
- pk_url_kwarg
- query_pk_and_slug
- get_object
- get_queryset
- get_slug_field
- get_context_object_name
- django.views.generic.base.ContextMixin
- extra_context
- django.views.generic.edit.ProcessFormView
- put
35class CustomUpdateView(OnSuccessMixin, UpdateView): 36 """ 37 A generic view class providing customized version of the `UpdateView` class. 38 """ 39 on_success = 'update_success' 40 template_name = 'vkk/generic/update.html' 41 drop_key = 'pk'
A generic view class providing customized version of the UpdateView
class.
Inherited Members
- django.views.generic.base.View
- View
- http_method_names
- view_is_async
- as_view
- setup
- dispatch
- http_method_not_allowed
- options
- django.views.generic.edit.UpdateView
- template_name_suffix
- django.views.generic.detail.SingleObjectTemplateResponseMixin
- template_name_field
- get_template_names
- django.views.generic.base.TemplateResponseMixin
- template_engine
- response_class
- content_type
- render_to_response
- django.views.generic.edit.BaseUpdateView
- get
- post
- django.views.generic.edit.ModelFormMixin
- fields
- get_form_class
- get_form_kwargs
- form_valid
- django.views.generic.edit.FormMixin
- initial
- form_class
- success_url
- prefix
- get_initial
- get_prefix
- get_form
- form_invalid
- get_context_data
- django.views.generic.detail.SingleObjectMixin
- model
- queryset
- slug_field
- context_object_name
- slug_url_kwarg
- pk_url_kwarg
- query_pk_and_slug
- get_object
- get_queryset
- get_slug_field
- get_context_object_name
- django.views.generic.base.ContextMixin
- extra_context
- django.views.generic.edit.ProcessFormView
- put
44class CustomDeleteView(OnSuccessMixin, DeleteView): 45 """ 46 A generic view class providing customized version of the `DeleteView` class. 47 """ 48 on_success = 'delete_success' 49 template_name = 'vkk/generic/delete.html' 50 drop_key = 'pk'
A generic view class providing customized version of the DeleteView
class.
Inherited Members
- django.views.generic.edit.BaseDeleteView
- BaseDeleteView
- form_class
- post
- form_valid
- django.views.generic.edit.DeleteView
- template_name_suffix
- django.views.generic.detail.SingleObjectTemplateResponseMixin
- template_name_field
- get_template_names
- django.views.generic.base.TemplateResponseMixin
- template_engine
- response_class
- content_type
- render_to_response
- django.views.generic.edit.DeletionMixin
- success_url
- delete
- django.views.generic.edit.FormMixin
- initial
- prefix
- get_initial
- get_prefix
- get_form_class
- get_form
- get_form_kwargs
- form_invalid
- get_context_data
- django.views.generic.detail.BaseDetailView
- get
- django.views.generic.detail.SingleObjectMixin
- model
- queryset
- slug_field
- context_object_name
- slug_url_kwarg
- pk_url_kwarg
- query_pk_and_slug
- get_object
- get_queryset
- get_slug_field
- get_context_object_name
- django.views.generic.base.ContextMixin
- extra_context
- django.views.generic.base.View
- http_method_names
- view_is_async
- as_view
- setup
- dispatch
- http_method_not_allowed
- options
53class CustomSuccessView(OnSuccessMixin, TemplateView): 54 """ 55 A generic view class offering some functionality for successful actions. 56 """ 57 model = None 58 on_success = 'default'
A generic view class offering some functionality for successful actions.
Inherited Members
- django.views.generic.base.View
- View
- http_method_names
- view_is_async
- as_view
- setup
- dispatch
- http_method_not_allowed
- options
- django.views.generic.base.TemplateView
- get
- django.views.generic.base.TemplateResponseMixin
- template_name
- template_engine
- response_class
- content_type
- render_to_response
- get_template_names
- django.views.generic.base.ContextMixin
- extra_context
- get_context_data
61class CustomListView(ListView): 62 """ 63 A generic view class providing customized and extended version of the 64 `ListView` class. 65 """ 66 keys = None 67 fields = None 68 paginate_by = 25 69 action_options = {'update': _('Update'), 'delete': _('Delete')} 70 template_name = 'vkk/generic/list.html'
A generic view class providing customized and extended version of the
ListView
class.
Inherited Members
- django.views.generic.base.View
- View
- http_method_names
- view_is_async
- as_view
- setup
- dispatch
- http_method_not_allowed
- options
- django.views.generic.list.MultipleObjectTemplateResponseMixin
- template_name_suffix
- get_template_names
- django.views.generic.base.TemplateResponseMixin
- template_engine
- response_class
- content_type
- render_to_response
- django.views.generic.list.BaseListView
- get
- django.views.generic.list.MultipleObjectMixin
- allow_empty
- queryset
- model
- paginate_orphans
- context_object_name
- paginator_class
- page_kwarg
- ordering
- get_queryset
- get_ordering
- paginate_queryset
- get_paginate_by
- get_paginator
- get_paginate_orphans
- get_allow_empty
- get_context_object_name
- get_context_data
- django.views.generic.base.ContextMixin
- extra_context
73class CustomFilterView(CustomListView): 74 """ 75 A generic view class extending `CustomListView` with added functionality 76 for filtering objects. 77 """ 78 template_name = 'vkk/generic/filter.html' 79 filter_fields = None 80 81 def get_filter_fields(self): 82 """ 83 Returns a list of fields associated with object model used for filtering. 84 """ 85 if self.filter_fields is not None: 86 return self.filter_fields 87 elif self.fields is not None and self.fields != '__all__': 88 return self.fields 89 elif self.fields is None: 90 raise ImproperlyConfigured( 91 'filter_fields or fields not specified.') 92 elif self.fields == '__all__': 93 raise ImproperlyConfigured( 94 "'__all__' not allowed (for security reasons).") 95 96 def get_filter(self): 97 """ 98 Returns a list of arguments for the filter()-method on a manager. 99 """ 100 filter_fields = self.get_filter_fields() 101 form = FilterForm(self.request.GET) 102 if form.is_valid(): 103 parameters = form.cleaned_data['query'].split() 104 else: 105 parameters = [] 106 if parameters: 107 qs = ( 108 Q( 109 **{field + '__icontains': str(param)} 110 ) for field in filter_fields for param in parameters 111 ) 112 query_filter = reduce(lambda q1, q2: q1 | q2, qs) 113 else: 114 query_filter = ~Q(pk=None) 115 return query_filter 116 117 def get_queryset(self): 118 """ 119 Returns a filtered queryset. 120 """ 121 return super().get_queryset().filter(self.get_filter()) 122 123 def get(self, request, *args, **kwargs): 124 if request.content_type == 'application/json': 125 query_values = self.get_queryset().values( 126 *self.get_filter_fields() 127 ) 128 suggestions = [' '.join( 129 (str(val) for val in obj.values()) 130 ) for obj in query_values] 131 return JsonResponse({'suggestions': suggestions}) 132 else: 133 return super().get(request) 134 135 def get_context_data(self, **kwargs): 136 context = super().get_context_data(**kwargs) 137 context["filter_form"] = FilterForm() 138 return context
A generic view class extending CustomListView
with added functionality
for filtering objects.
81 def get_filter_fields(self): 82 """ 83 Returns a list of fields associated with object model used for filtering. 84 """ 85 if self.filter_fields is not None: 86 return self.filter_fields 87 elif self.fields is not None and self.fields != '__all__': 88 return self.fields 89 elif self.fields is None: 90 raise ImproperlyConfigured( 91 'filter_fields or fields not specified.') 92 elif self.fields == '__all__': 93 raise ImproperlyConfigured( 94 "'__all__' not allowed (for security reasons).")
Returns a list of fields associated with object model used for filtering.
96 def get_filter(self): 97 """ 98 Returns a list of arguments for the filter()-method on a manager. 99 """ 100 filter_fields = self.get_filter_fields() 101 form = FilterForm(self.request.GET) 102 if form.is_valid(): 103 parameters = form.cleaned_data['query'].split() 104 else: 105 parameters = [] 106 if parameters: 107 qs = ( 108 Q( 109 **{field + '__icontains': str(param)} 110 ) for field in filter_fields for param in parameters 111 ) 112 query_filter = reduce(lambda q1, q2: q1 | q2, qs) 113 else: 114 query_filter = ~Q(pk=None) 115 return query_filter
Returns a list of arguments for the filter()-method on a manager.
117 def get_queryset(self): 118 """ 119 Returns a filtered queryset. 120 """ 121 return super().get_queryset().filter(self.get_filter())
Returns a filtered queryset.
123 def get(self, request, *args, **kwargs): 124 if request.content_type == 'application/json': 125 query_values = self.get_queryset().values( 126 *self.get_filter_fields() 127 ) 128 suggestions = [' '.join( 129 (str(val) for val in obj.values()) 130 ) for obj in query_values] 131 return JsonResponse({'suggestions': suggestions}) 132 else: 133 return super().get(request)
135 def get_context_data(self, **kwargs): 136 context = super().get_context_data(**kwargs) 137 context["filter_form"] = FilterForm() 138 return context
Get the context for this view.
Inherited Members
- django.views.generic.base.View
- View
- http_method_names
- view_is_async
- as_view
- setup
- dispatch
- http_method_not_allowed
- options
- django.views.generic.list.MultipleObjectTemplateResponseMixin
- template_name_suffix
- get_template_names
- django.views.generic.base.TemplateResponseMixin
- template_engine
- response_class
- content_type
- render_to_response
- django.views.generic.list.MultipleObjectMixin
- allow_empty
- queryset
- model
- paginate_orphans
- context_object_name
- paginator_class
- page_kwarg
- ordering
- get_ordering
- paginate_queryset
- get_paginate_by
- get_paginator
- get_paginate_orphans
- get_allow_empty
- get_context_object_name
- django.views.generic.base.ContextMixin
- extra_context