[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‘] = ‘[email protected]‘
            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

原文地址:https://www.cnblogs.com/dapianzi/p/8423383.html

时间: 2024-07-31 03:09:26

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

Django之views.py视图函数学习

视图函数: 视图函数时存在django项目中的应用程的一个名为views.py的文件模块: 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 一个简单的视图: 下面是一个以HTML文档的形式返回当前日期和时间的视图: views.py 1 from django.http import HttpResponse 2 3 import datetime 4 5 def current_datetime(request): 6 7 now =

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

常规的模板渲染 from django.db import models # Create your models here. class ArticalType(models.Model): caption = models.CharField(max_length=16) class Category(models.Model): caption = models.CharField(max_length=16) class Artical(models.Model): title = mo

Django 笔记 manage.py sync 错误

大年三十大家不放鞭炮果然安静了好多,没事继续看django的书 前几天看到了数据模型就一直卡在那里,今天特地把mysql替换成文本数据库sqlite试试看 但是遇到了manage.py sync 错误,无法创建初始数据库 C:\OneDriver\OneDrive\python\csvr>python manage.py sync Unknown command: 'sync' Type 'manage.py help' for usage. 然后help了一下,尼玛果然连sync参数都没有 C

django导入 views.py

网上找了各种教程..均无解....自己摸索出来了..分享 给大家... 首先INSTALLED_APP 加入 自己的 app pili,然后如下图 from App名称 import views 就 ok了!!!! 本来很简单で意见事情,但是自己一弄,就蒙了..使用 import pili  然后  pili.views.TestUEditor 完全没作用,提示未找到...无语

Django之views.py详解

http请求中产生的两个核心对象: http请求:HttpRequesthttp响应:HttpResponse 所在位置:from django.http import HttpRequest,HttpResponse 1.HttpRequest:HttpRequest对象的属性: Attribute Description path 请求页面的全路径,不包括域名—例如, “/music/bands/the_beatles/” method 请求中使用的HTTP方法的字符串表示.全大写表示.例如

django之urls与视图函数views的简单学习

我们先了解一下urls和views分别是干嘛用的: urls: URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码 urls.py里面的基本格式如下: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 一般我们只会用到url里面

django views.py视图 获取用户请求相关信息以及请求头

请求的其他信息 用户发来请求时候,不仅发来数据,也把请求头也发过来 在views.py 怎么找请求数据? request是一个对象,这个对象封装很多信息,可以先查这个对象的类 print(type(request)) from django.shortcuts import reverse def index(request): v = reverse('author:index') print(v) print(type(request)) # 找到这个类 导入这个类 <class 'djan

Django视图层(views.py)

视图函数 接受Web请求并且返回Web响应.由此,视图函数应该接收请求对象HttpRequest,并返回响应对象HttpResponse. request django将请求报文中的请求行.首部信息.内容主体封装成 HttpRequest 类中的属性. request.scheme # 请求的协议,一般为http或者https,字符串格式(以下属性中若无特殊指明,均为字符串格式)request.body   #http请求的主体,二进制格式.request.path        # 所请求页面

Django基础之视图层(views.py)和模板层

目录 Django基础之视图层(views.py)和模板层 视图层 JsonResponse对象 form表单上传文件 FBV与CBV 即CBV源码分析 django settings源码分析及实际应用 模板层 模板传值 过滤器( | ) 常用内置过滤器 其他过滤器(了解) 标签 if判断 for循环 with标签 csrf_token标签 自定义过滤器和标签 自定义过滤器 自定义标签 自定义过滤器和标签的区别 模板的继承 模板的导入 Django基础之视图层(views.py)和模板层 视图层