标题有点长也有点有趣哈,这里想要说明的并不是喝酒断片,当然,近期的喜酒也没少喝。从博客后台的数据显示,最后一次更新文章都是在上个月的21号了.原本以为一天就可以更新几篇垃圾文章的我到目前已是一个月更新一次甚至如标题所言要维持不断篇而书写了。
# -*- coding: utf-8 -*- from django.http import JsonResponse, Http404 from django.contrib.contenttypes.models import ContentType#import ContentType类用于解析请求模型类 allow_models = ['client','online','offline] #允许请求的模型class列表,安全机制(一个列表),作用是匹配到的请求中只允许在这个列表里面,否则返回404 class RequiredModelListMixin(object): def dispatch(self, request, *args, **kwargs): request_model = self.kwargs.get('model', None)#获取请求的字符串 print "request_model is: %s" %(request_model) if request_model in allow_models:#判断是否允许 if request_model in ['online','offline']:#子判断指向同一个模型,我这里特殊了 model_type = ContentType.objects.get(app_label='core', model='device') else: model_type = ContentType.objects.get(app_label='core', model=request_model)#通用匹配 self.model = model_type.model_class()#得到一个 self.model (重要)这里得到的self.model供ListModelView这个类使用 else: raise Http404()#不安全的匹配请求返回404. return super(RequiredModelListMixin, self).dispatch(request, *args, **kwargs)#super好咯,上面就是mixins.py安全匹配到用户请求的模型类。更好的代码应该加一个大小写转换,强制小写。 下面是ListModelView这个通用视图类部分代码:
# -*- coding: utf-8 -*- from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import ListView from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.db.models import Q # Create your views here. from core.models import * from core.mixins import RequiredModelListMixin class ListModelView(LoginRequiredMixin, RequiredModelListMixin, ListView):#继承三个类,登录用户访问,上面mixins.py处理的self.model类,通用ListView类 def get_template_names(self):#解析视图使用的模板 object_model = self.kwargs.get('model') if self.request.is_ajax(): self.template_name = "%s/ajax_list.html" %(object_model) else: self.template_name = "%s/list.html" %(object_model) return [self.template_name] def get_paginate_by(self, queryset):#请求分页 self.paginate_by = self.request.GET.get('paginate_by', '11') return self.paginate_by def get_ordering(self):#请求查询的排序方式 self.order_by = self.request.GET.get('order_by', '-modified') return self.order_by def get_queryset(self):#请求查询(重点) self.data = super(ListModelView, self).get_queryset() flag = self.kwargs.get('model')#标记请求,用于下面的特殊判断 ordering = self.request.GET.get('order_by', '-modified')#默认的排序方式 search = self.request.GET.get('search', None)#如果有search请求,得到search数据 if flag == 'client' and search:#判断有无search self.data = self.model.objects.filter(Q(desc__icontains=search)|Q(name__icontains=search)).order_by(ordering)#查询语句 elif flag == 'your_other_model' and search: self.data = self.model.objects.filter(Q(flag_value__icontains=search)|Q(onidc__name__icontains=search)) else: self.data = self.model.objects.order_by(ordering)#默认查询集 return self.data#返回数据 def get_context_data(self, **kwargs):#模板上下文 self.flag = self.kwargs.get('model') model_meta = {} model_meta['flag'] = self.flag context = super(ListModelView, self).get_context_data(**kwargs) paginator = Paginator(self.data, self.paginate_by) page = self.request.GET.get('page') try: new_list = paginator.page(page) except PageNotAnInteger: new_list = paginator.page(1) except EmptyPage: new_list = paginator.page(paginator.num_pages) context['object_list'] = new_list context['header_label'] = model_meta return context至此,一个通用的ListView功能完成:
俺暂时没断篇,不过坚持不断篇几乎不可能
回复取消回复那要看定一个什么样的时间啊,像我这早就开始定一个月为期了。
回复取消回复发生了不可告人的秘密
回复取消回复比如说呢?
回复取消回复