从维持不断篇到差点断篇,这个月发生了什么

标题有点长也有点有趣哈,这里想要说明的并不是喝酒断片,当然,近期的喜酒也没少喝。从博客后台的数据显示,最后一次更新文章都是在上个月的21号了.原本以为一天就可以更新几篇垃圾文章的我到目前已是一个月更新一次甚至如标题所言要维持不断篇而书写了。

12月份确实是一个忙碌的月,而且我发现我的Word 2013怎么那么难书写,输入快了的时候指针都会漂移(偏移输入节点了),还时不时要按Ctrl+s。刚刚完成了一份总结,之前Cnblogs上面看到了些有趣的总结。才知道现在连总结也是用表情图片来完成的。这真特么是一个巨大项目啊哈哈~ 说点什么呢?说说Django开发过程中赶脚一些比较精华的代码吧----Django Listview通用查询,分页,排序等等。简约代码实现多个模型中通用的功能。下面是我这里的listview实现上面功能主要用到的文件树(红色字体): . ├── admin.py ├── apps.py ├── choices.py ├── details.py ├── exports.py ├── forms.py ├── __init__.py ├── lists.py ├── migrations │   ├── 0001_initial.py │   ├── 0001_initial.pyc │   ├── __init__.py │   └── __init__.pyc ├── mixins.py├── models.py ├── templatetags │   ├── app_extras.py │   ├── app_extras.pyc │   ├── __init__.py │   └── __init__.pyc ├── tests.py ├── tools.py ├── urls.py└── views.py urls.py设计: url(r'^(?:list/(?P<model>\w+))/$', views.ListModelView.as_view(), name='model_list'), 匹配/list/<yourmodel>/,指向通用listeview类:ListModelView,url解析名:model_list 。都是区分大小写不用多说。比如访问url:https://1.1.1.1/list/client/ ,这里会展示你的Client模型的经过ListModelView这个类处理过的列表信息。 mixins.py精华: 这里要做的事情就是解析上面url中的<yourmodel>,并转换成一个合理请求的model类(前提是这个类必须存在) 代码下述,这里有必要展示一个model例。

上面是一个Django精简后的Client模型类。主要有三个字段。mixins.py部分代码如下:
# -*- 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功能完成:

上一篇Previous

说的话要配得上自己的责任心,吹嘘是要有能力的。

下一篇Next

别再调戏广东没有冬天

4 条评论添加评论

俺暂时没断篇,不过坚持不断篇几乎不可能

回复取消回复
@gibbonyang

那要看定一个什么样的时间啊,像我这早就开始定一个月为期了。

回复取消回复