views.py 是django MTV 中的主要逻辑层,相当于MVC中的 Controller

以下的实例都基于这样一个路由表:

urlpatterns = [
url(r'^(index)?$', views.index, name='index'),
url(r'^posts/$', views.PostsView.as_view(), name='posts'),
url(r'^article/(?P<aid>[0-9]+)/$', views.ArticleView.as_view(), name='detail'),
]

view 方法

虽然views.py是系统自动创建,但是不难发现它并不是必须的。django 关心的是 urls.py 中 import 的是谁。(urls.py 也是项目文件夹下面 urls.py 中引入的)

from django.shortcuts import render, Http404, HttpResponse
def index(request):
# return HttpResponse('Hello world')
word = request.GET.get('word', '')
context = {
'title': 'Dapianzi Carl',
'word': word if s.strip() else '文档里写的很详细,我只是做一点归纳总结',
}
return render(request, 'app/index.html', context)

view 方法返回一个 <HttpResponse Object> ,可以传递给后面的中间件进行处理。django 封装了一些快捷方法比如 render, getObjectOr404等。

通常只需要使用render。第一个参数是 request 对象,第二个是模板文件,第三个是模板变量。

个人感觉django 在views中操作models的时候慎用 Models.objects.get() ,动不动就给你来一个 DoesNotExists 惊喜

快捷函数

官方文档是最靠谱的Django shortcut functions

  • render 用得最多,上文有粗略介绍。
  • redirect 重载多次,功能看起来挺丰富,笔者实际使用不多。需要配合 Models 的 get_absulute_url 方法
  • get_object_or_404
  • get_list_or_404

view 类

不同于view方法, view 类在路由映射中要用 SomeView.as_view()。

  • View 在一个url里根据http method 来处理不同逻辑。处理数据增改操作经常碰到:
    class add(View):
def get(self, request):
# view add form
return render(...)
def post(self, request):
# create new item
return redirect(...)
  • TemplateView 一般不需要处理参数的页面可以使用。使用它需要定义template_name属性和重写get_context_data方法
    class Contact(TemplateView):
    template_name = 'app/contact.html'
    def get_context_data(self, **kwargs):
    # 初始化模板变量
    context = super().get_context_data(**kwargs)
    context['email'] = 'carl@dapianzi.me'
    context['interest'] = InterestModel.objects.all()
    return context
  • DetailView, ListView 高度封装的 列表view 和 内容view

    ListView 需要重写 get_query_set() 方法,返回的queryset会赋值给key为context_object_name属性的 context

    DetailView 需要指定主键id在 路由表中的名称,然后实现 get_object() 方法
    class PostsView(ListView):
    template_name = 'app/posts.html'
    # 模板中引用的列表变量名称
    context_object_name = 'post_list'
    def get_query_set(self):
    # 注意获取url参数的方法,request对象被封装在 self.request 中
    param = self.request.GET.get('param', '')
    return Articles.objects.filter(name__contains=param) class ContentView(DetailView):
    # 定义模型
    model = Article
    # 模板
    template_name = 'app/post.html'
    # 模板变量名
    context_object_name = "post"
    # url 路由主键id
    pk_url_kwarg = 'aid'
    def get_object(self, **kwargs):
    obj = super(ArticleView, self).get_object()
    # 对obj进行额外操作,如记录日志,增加浏览数
    obj.views+=1
    obj.save()
    return obj

获取参数

如果实现的方法带有request参数,那么直接用request.GET/request.POST获取

实现的方法里没有request参数(比如ListView),通常是类里面的一个属性,这个可能需要查文档看源码。。。

其他类型的httpresponse

检查源码或者查看Django文档可以看到有其他类型的Response对象,其实就是文件头不一样而已。下面试导出csv的一个实例:

def export_csv(self, request, queryset):
"""导出csv"""
response = StreamingHttpResponse('\n'.join([','.join(
# list元素转str
list(map(lambda x: str(x), x))
)
for x in list(
# queryset 转 list
queryset.values_list('name', 'max_item', 'expire_time', 'active')
# charset 非常重要
)]), charset='gbk', content_type='attachment/csv')
# 额外的http-headers
response['Content-Disposition'] = 'attachment;filename="test.csv"'
return response

[Django笔记] views.py 深入学习的更多相关文章

  1. Django之views.py视图函数学习

    视图函数: 视图函数时存在django项目中的应用程的一个名为views.py的文件模块: 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一 ...

  2. django中将views.py中的python方法传递给html模板文件

    常规的模板渲染 from django.db import models # Create your models here. class ArticalType(models.Model): cap ...

  3. Django笔记 manage.py脚本的使用

    1. 管理Django项目 python manage.py startproject projectname # 新建Django project ~~projectname是自己的项目名称 pyt ...

  4. Django之views.py详解

    http请求中产生的两个核心对象: http请求:HttpRequesthttp响应:HttpResponse 所在位置:from django.http import HttpRequest,Htt ...

  5. django导入 views.py

    网上找了各种教程..均无解....自己摸索出来了..分享 给大家... 首先INSTALLED_APP 加入 自己的 app pili,然后如下图 from App名称 import views 就 ...

  6. [Django笔记] django结构分析

    看了一段时间django官方文档,先把自己理解的django目录结构记录一下 目录结构 一个成熟的django项目的结构大致如下: /project/ |-- project/ |-- setting ...

  7. Django笔记&教程 7-1 基于类的视图(Class-based views)介绍

    Django 自学笔记兼学习教程第7章第1节--基于类的视图(Class-based views)介绍 点击查看教程总目录 1 介绍 Class-based views (CBVs) are view ...

  8. Django笔记&教程 7-3 拓展CBVs(Class-based views)

    Django 自学笔记兼学习教程第7章第3节--拓展CBVs(Class-based views) 点击查看教程总目录 一般而言,直接使用原生的Class-based views,能展现的样式和内容是 ...

  9. Django 千锋培训的学习笔记(2)

    Django 千锋培训读书笔记 https://www.bilibili.com/video/av17879644/?p=1 切换到创建项目的目录 cd C:\Users\admin\Desktop\ ...

随机推荐

  1. Linux系统下如何去掉文件的@属性

    前几天从别处copy了一个memcached.so文件,发现运行不了,用ls -l 看了一下发现memcached.so多了一个@属性,如何去掉这个@属性呢? 第一步:ls -laeO@ 第二步:xa ...

  2. Java-API:un-java.text.DecimalFormat

    ylbtech-Java-API:java.text.DecimalFormat 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 0. https://docs. ...

  3. Flash在线签名小程序,可回放,动态导出gif图片

    需求: 公司为了使得和客户领导签字的时候记录下来,签字过程,可以以后动态回放演示,最好是gif图片,在网页上也容易展示,文件也小. 解决过程: 始我们去寻找各种app,最终也没有找到合适的,后来我在f ...

  4. pycharm中 unittests in xxxx 运行模式

    pycham中 当你运行时 ,使用的 是  Run "unittests in  xxxx" 模式时候,if __name__ == '__main__':  后面的代码是不执行的 ...

  5. DVWA平台v1.9-Command Injection

    命令拼接: &:简单的拼接,第一条命令和第二条命令间没有什么制约关系 &&:第一条命令执行成功了,才会执行第二条命令 |:第一条命令的输出作为第二条命令的输入 ||:第一条命令 ...

  6. 球的移动(move)

    有n个盒子(1<=N<=1000)围成一个圈,每个盒子有ai个球,所有盒子的球的总数小于等于n.每一次移动,可以把一个球移动到它的一个相邻的盒子内.现在要使得每个盒子的球数<=1,求 ...

  7. SQL 实现行列互换

    Oracle:不过大多数是采用 oracle 数据库当中的一些便捷函数进行处理,比如 ”pivot”: MySql:目前没有找到更好的方法 题目:数据库中有一张如下所示的表,表名为sales. 年 季 ...

  8. hadoop再次集群搭建(3)-如何选择相应的hadoop版本

    之前接触过很多很多hadoop版本,现在重新搭建平台,面临选择哪个版本的问题. 当我们决定是否采用某个软件用于开源环境时,通常需要考虑以下几个因素: (1)是否为开源软件,即是否免费. (2) 是否有 ...

  9. 【转】webService概述

    一.序言: 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是We ...

  10. oracle --(一)数据块(data Block)

    基本关系:数据库---表空间---数据段---分区---数据块 数据块(data Block)一.数据块Block是Oracle存储数据信息的最小单位.这里说的是Oracle环境下的最小单位.Orac ...