Django

Django

Explore django code snippets and tutorials

Django

Class based ajax views for django

<p>The&nbsp; code defines several Django views that handle AJAX requests for different actions in a web application. The views are designed to respond with JSON containing HTML content that can …

python
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
from django.http import JsonResponse
from django import template
from django.template.loader import render_to_string
from django.template.loader import TemplateDoesNotExist


class AjaxListView:
    def get(self, request, *args, **kwargs):
        ajax_list_partial = self.ajax_list_partial
        self.object_list = super().get_queryset()
        context = super().get_context_data(**kwargs)
        if not ajax_list_partial:
            raise TemplateDoesNotExist("No ajax__list_partial provided {}".format(self))
        if request.is_ajax():
            html_form = render_to_string(self.ajax_list_partial, context, request)
            return JsonResponse({'html_form': html_form})
        return super().get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['object_list'] = super().get_queryset()
        return context


class AjaxCreateView:
    def get(self, request, *args, **kwargs):
        self.object = None
        ajax_create_partial = self.ajax_create_partial
        ajax_list_partial = self.ajax_list_partial
        context = super().get_context_data(**kwargs)
        if not ajax_create_partial or not ajax_list_partial:
            raise TemplateDoesNotExist("No ajax_create_partial or ajax_list_partial provided {}".format(self))
        if request.is_ajax():
            html_form = render_to_string(self.ajax_create_partial, context, request)
            return JsonResponse({'html_form': html_form})
        return super().get(request, *args, **kwargs)

    def form_valid(self, form):
        data = dict()
        context = self.get_context_data()
        if form.is_valid():
            form.save()
            data['form_is_valid'] = True
            data['list'] = render_to_string(
                    self.ajax_list_partial, context, self.request)
        if self.request.is_ajax():
            return JsonResponse(data)
        return super().form_valid(form)

    def form_invalid(self, form):
        data = dict()
        context = self.get_context_data()
        data['form_is_valid'] = False
        data['html_form'] = render_to_string(
                self.ajax_create_partial, context, request=self.request)
        if self.request.is_ajax():
            return JsonResponse(data)
        return super().form_invalid(form)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['object_list'] = super().get_queryset()
        return context



class AjaxUpdateView:
    def get(self, request, *args, **kwargs):
        ajax_update_partial = self.ajax_update_partial
        ajax_list_partial = self.ajax_list_partial
        self.object = super().get_object()
        context = super().get_context_data(**kwargs)
        if not ajax_update_partial or not ajax_list_partial:
            raise TemplateDoesNotExist("No ajax_update_partial or ajax_list_partial provided {}".format(self))
        if request.is_ajax():
            html_form = render_to_string(self.ajax_update_partial, context, request)
            return JsonResponse({'html_form': html_form})
        return super().get(request, *args, **kwargs)

    def form_valid(self, form):
        data = dict()
        context = self.get_context_data()
        if form.is_valid():
            form.save()
            data['form_is_valid'] = True
            data['list'] = render_to_string(
                    self.ajax_list_partial, context, self.request)
        if self.request.is_ajax():
            return JsonResponse(data)
        return super().form_valid(form)

    def form_invalid(self, form):
        data = dict()
        context = super().get_context_data()
        data['form_is_valid'] = False
        data['html_form'] = render_to_string(
                self.ajax_update_partial, context, request=self.request)
        if self.request.is_ajax():
            return JsonResponse(data)
        return super().form_invalid(form)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['object_list'] = super().get_queryset()
        return context


class AjaxDeleteView:
    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        context = super().get_context_data(**kwargs)
        ajax_delete_partial = self.ajax_delete_partial
        ajax_list_partial = self.ajax_list_partial
        if not ajax_delete_partial or not ajax_list_partial:
            raise TemplateDoesNotExist("No ajax_delete_partial or ajax_list_partial provided {}".format(self))
        if request.is_ajax():
            html_form = render_to_string(
                    self.ajax_delete_partial, context, request)
            return JsonResponse({'html_form': html_form})
        return super().get(request, *args, **kwargs)

    def post(self, *args, **kwargs):
        ajax_delete_partial = self.ajax_delete_partial
        ajax_list_partial = self.ajax_list_partial
        if self.request.is_ajax():
            self.object = super().get_object()
            self.object.delete()
            data = dict()
            data['form_is_valid'] = True
            context = super().get_context_data(**kwargs)
            context['object_list'] = self.get_queryset()
            data['list'] = render_to_string(
                    self.ajax_list_partial, context, self.request)
            return JsonResponse(data)
        return self.delete(*args, **kwargs)
Django

Django pagination function

Django pagination function

python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


def get_pagination(request, queryset, items):
    '''
    items: The number for pagination

    return tuple (total_pages, paginated queryset) 
    '''
    paginator = Paginator(queryset, items)
    page = request.GET.get('page')
    try:
        items_page = paginator.page(page)
    except PageNotAnInteger:
        items_page = paginator.page(1)
    except EmptyPage:
        items_page = paginator.page(paginator.num_pages)
    return (paginator.num_pages, items_page)
Django

Django custom simple tags

Django custom simple tags

python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from django import template
from django.urls import reverse_lazy
register = template.Library()


@register.simple_tag(takes_context=True)
def get_url(context, *args):
    '''
    example 1  "{% get_url 'list' %}"
    example 2  "{% get_url 'create' %}"
    example 3  "{% get_url 'create' 'cms' %}"
    example 4  "{% get_url 'detail' obj  %}"
    example 5  "{% get_url 'detail' obj 'cms'  %}"

    the first argument is action create or list or detail or update or delete
    the second argument is a model object
    the third argument is custom app

    the name of url pattern so as to work

    app:model-create
    app:model-update
    app:model-delete
    app:model-detail
    '''

    model = context['model']
    obj = None
    print(len(args))
    lower_name = model.__name__.lower()
    app = model._meta.app_label
    if len(args) == 0:
        return ''
    if len(args) == 2:
        action = args[0]
        app = args[1]
    if len(args) ==3:
        action = args[0]
        obj = args[1]
        app = args[2]
        lower_name = obj.__class__.__name__.lower()

    url_string = '{}:{}-{}'.format(app, lower_name, action)
    if hasattr(obj, 'uuid'):
        url = reverse_lazy(url_string, kwargs={'uuid': obj.uuid})
    if(hasattr(obj, 'slug')):
        url = reverse_lazy(url_string, kwargs={'slug': obj.slug})
    if hasattr(obj, 'pk'):
        url = reverse_lazy(url_string, kwargs={'pk': obj.pk})

    if not obj:
        url_string = '{}:{}-{}'.format(app, lower_name, action)
        url = reverse_lazy(url_string)
    return url