[Django笔记] views.py 深入学习
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 深入学习的更多相关文章
- Django之views.py视图函数学习
视图函数: 视图函数时存在django项目中的应用程的一个名为views.py的文件模块: 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一 ...
- django中将views.py中的python方法传递给html模板文件
常规的模板渲染 from django.db import models # Create your models here. class ArticalType(models.Model): cap ...
- Django笔记 manage.py脚本的使用
1. 管理Django项目 python manage.py startproject projectname # 新建Django project ~~projectname是自己的项目名称 pyt ...
- Django之views.py详解
http请求中产生的两个核心对象: http请求:HttpRequesthttp响应:HttpResponse 所在位置:from django.http import HttpRequest,Htt ...
- django导入 views.py
网上找了各种教程..均无解....自己摸索出来了..分享 给大家... 首先INSTALLED_APP 加入 自己的 app pili,然后如下图 from App名称 import views 就 ...
- [Django笔记] django结构分析
看了一段时间django官方文档,先把自己理解的django目录结构记录一下 目录结构 一个成熟的django项目的结构大致如下: /project/ |-- project/ |-- setting ...
- Django笔记&教程 7-1 基于类的视图(Class-based views)介绍
Django 自学笔记兼学习教程第7章第1节--基于类的视图(Class-based views)介绍 点击查看教程总目录 1 介绍 Class-based views (CBVs) are view ...
- Django笔记&教程 7-3 拓展CBVs(Class-based views)
Django 自学笔记兼学习教程第7章第3节--拓展CBVs(Class-based views) 点击查看教程总目录 一般而言,直接使用原生的Class-based views,能展现的样式和内容是 ...
- Django 千锋培训的学习笔记(2)
Django 千锋培训读书笔记 https://www.bilibili.com/video/av17879644/?p=1 切换到创建项目的目录 cd C:\Users\admin\Desktop\ ...
随机推荐
- 操作Oracle 一条龙
1 引用Oracle.DataAccess.dll 2 App.Config中配置连接字符串: Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TC ...
- 反射ORM 三层(for sql server/mysql)
sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 RPROM.cs //(写错愕,应该是RPORM) RPROM.Insert(p1); //需求:DBS中 ...
- 本地dns服务器到底是什么?有没有精确的概念?
1.本地dns到底是什么?为什么有时候看到的本地dns的ip是局域网类型的ip? 有的人说本地dns的概念——————是运营商提供的dns, 有的人也说,是你的局域网里的路由器一类的设备里的dns. ...
- C Primer Plus学习笔记(二)- 数据和C
从一个简单的程序开始 #include <stdio.h> int main(void) { float weight; float value; printf("Please ...
- Android 4学习(4):概述 - Using Resources
参考:<Professional Android 4 Application Development> Andorid中的资源包括用户自定义资源和系统自带资源,这两种资源既可以在代码中使用 ...
- java线程面试题及答案
1)2017Java面试题及答案:什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务 ...
- jQuery实现页内锚点平滑跳转
当页面内容长多,导致页面高度过高或过宽是,浏览起来就有点费劲,不过使用了锚点平滑跳转效果可以实现页面的跳转,从而加快速浏览想要浏览的模块.具体做法如下: 首先是菜单(锚点)的写法 <a href ...
- div的作用
<div></div>主要是用来设置涵盖一个区块为主,所谓的区块是包含一行以上的数据,所以在<div></div>的开始之前与结束后,浏览都会自动换行, ...
- C语言学习笔记--#和##操作符
1. #运算符 (1)#运算符用于在预处理期将宏的参数转换为字符串 (2)#的转换作用是在预处理期完成的,因此只在宏定义中有效,即其他地方不能用#运算符 (3)用法:#define STRING(x) ...
- DAY13-前端之JavaScript
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客 ...