django view

URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应。

随便新建一个Django项目,默认会自动为我们创建一个/project_name/urls.py文件,并且自动包含下面的内容,这就是项目的根URL:

配置media媒体文件

  • settings.py
# 媒体文件配置MEDIA_URL = '/media/'MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  • url.py

确保在渲染的html渲染对应的媒体文件

from django.urls import path,includefrom django.conf import settingsfrom django.conf.urls.static import  staticurlpatterns = [    # path('admin/', admin.site.urls),    path('myadmin/',include('myadmin.urls')),    path('',include('news.urls')),    path('',include('verification.urls')),    path('course/',include('course.urls')),    path('doc/',include('doc.urls')),    path('user/',include('user.urls')),    path('ckeditor/',include('ckeditor_uploader.urls')),] + static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)

需要在urlpatterns 列表后面加上 static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)

  • include 指的就是包含该app下的url
对于大部分的view视图一般写成类的形式
from  django.views import Viewclass IndexView(View):    '''    在线课堂首页面    '''    def get(self,request):        # 1. 拿到所有的视频数据        courses = Course.objects.only('title','cover_url','teacher__name','teacher__title').select_related('teacher').filter(is_delete = False)        return render(request,'course/course.html',context= {'courses':courses})

class CourseDetailView(View):    '''    课程详细页    url :/course/<int:course_id>/    '''    def get(self,request,course_id):        # 1. 拿到课程信息        course = Course.objects.only('title','cover_url','video_url','profile','outline','teacher__name','teacher__photo','teacher__title','teacher__profile').select_related('teacher').filter(is_delete = False,id = course_id)        # 2. 渲染html        if course:            course = course[0]            return  render(request,'course/course_detail.html',context={'course':course})

        else:            return  Http404('此课程不存在')
  • 对应的url就使用as_view()函数方法
from django.urls import pathfrom  . import viewsapp_name = 'course'

urlpatterns = [    path('',views.IndexView.as_view(),name = 'index'),    path('<int:course_id>/',views.CourseDetailView.as_view(),name = 'course_detail'),]

视图一般编写步骤

  • 拿到对应数据库的模型对象
  • 渲染到对于的html页面
在类中有三个重要的访问函数方法
  • get

就是当我访问当url是,就是执行get的方法

def get(self, request):    return render(request, 'user/login.html')
  • post
class LoginView(View):    """    登录视图    url: /user/login/    """    def get(self, request):        return render(request, 'user/login.html')

    def post(self, request):        # 1.先校验        # loginform是登录的表单,在form.py编写导入        form = LoginForm(request.POST, request=request)

        if form.is_valid():            return json_response(errmsg='恭喜登录成功!')        else:            # 将表单的报错信息进行拼接            err_msg_list = []            for item in form.errors.values():                err_msg_list.append(item[0])

            err_msg_str = '/'.join(err_msg_list)            return json_response(errno=Code.PARAMERR, errmsg=err_msg_str)

如当我登录的时候就会访问登录的界面发送get请求,提交数据在数据库就是post请求

  • put

put请求容易给人忽视,用于修改,当要修改用户的数据

class UserUpdateView(View):    """    用户更新视图    url:/myadmin/user/<int:user_id>/

    def get(self, request, user_id):        user = User.objects.filter(id=user_id).first()        if user:            form = UserModelForm(instance=user)        else:            return json_response(errno=Code.NODATA, errmsg='没有此用户!')        return render(request, 'myadmin/user/user_detail.html', context={'form': form})    """

    def put(self, request, user_id):        # 1. 拿到要修改的用户对象        user = User.objects.filter(id=user_id).first()        # 1.1 判断用户是否存在        if not user:            return json_response(errno=Code.NODATA, errmsg='没有此用户!')        # 2. 拿到前端传递的参数        put_data = QueryDict(request.body)        # 3. 校验参数        # 3.1 创建表单对象        # UserModelForm在form.py自定义的        form = UserModelForm(put_data, instance=user)        if form.is_valid():            # 4. 如果成功,保存数据            form.save()            return json_response(errmsg='用户修改成功!')        else:            # 5. 如果不成功就返回渲染了错误提示信息的页面            return render(request, 'myadmin/user/user_detail.html', context={'form': form})

QueryDict

>>> QueryDict('a=1&a=2&c=3')<QueryDict: {'a': ['1', '2'], 'c': ['3']}>

一般我们看到的数据就是json的键值对,而不是列表

request.body就是form表单的数据

Queryset

Django ORM用到三个类:Manager、QuerySet、Model。

Manager定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法;

QuerySet:Manager类的一些方法会返回QuerySet实例

就是从数据库根据自己要求拿数据的

连数据都那不出来,写啥视图

所以在编写queryset必须用django shell 调试

在model中,Django通过给Model增加一个objects属性来提供数据操作大的接口。比如:想要查询所有评论的数据,可以这么写:

Comments.objects.all()# 可切片Comments.objects.all()[0:1]# 可迭代for coment in comments:    print(comment.author )  
  • exists() 判断是否存在

难度提升


doc model

# is_delete是继承baseModeldocs = Doc.objects.values('file_url','file_name','title','desc','image_url').filter(is_delete= False)

现在拿到没有删除的部分数据,不拿author字段

app.object的用法

  • filter() 过滤查询对象。
  • exclude() 排除满足条件的对象
  • annotate() 使用聚合函数
  • order_by() 对查询集进行排序
  • reverse() 反向排序
  • distinct() 对查询集去重
  • values() 返回包含对象具体值的字典的QuerySet
  • values_list() 与values()类似,只是返回的是元组而不是字典。
  • dates() 根据日期获取查询集
  • datetimes() 根据时间获取查询集
  • none() 创建空的查询集
  • all() 获取所有的对象
  • union() 并集
  • intersection() 交集
  • difference() 差集
  • select_related() 附带查询关联对象
  • prefetch_related() 预先查询
  • extra() 附加SQL查询
  • defer() 不加载指定字段
  • only() 只加载指定的字段
  • using() 选择数据库
  • select_for_update()
  • raw()

raw() 使用sql

不熟悉SQL的可以跳过该部分,如下代码:sql = 'select * from new' #需要查询数据库具体new对应表名qs = new.objects.raw(sql) #将sql语句转成RawQuerySet对象该SQL是获取全部记录,相当于QuerySet如下查询:qs = new.objects.all()

filter()

filter是筛选的意思,通过filter筛选得到符合条件的数据集。

tags = Tag.objects.only('name').filter(is_delete=False)

values() only()

返回的是queryset字典,不是对象,only才是返回的是对象

 docs = Doc.objects.values('file_url','file_name','title','desc','image_url').filter(is_delete= False)

docs = Doc.objects.only('file_url','file_name','title','desc','image_url').filter(is_delete= False)

select_related()

如果我要拿这个模型通过外键绑定的另外一个模型,使用select_related

course 模型定义了teacher字段绑定teacher模型

course = Course.objects.only('title','cover_url','video_url','profile','outline','teacher__name','teacher__photo','teacher__title','teacher__profile').select_related('teacher').filter(is_delete = False,id = course_id)

重点

官方文档:https://docs.djangoproject.com/en/2.1/topics/db/aggregation/

Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询,是Django高手们必需要熟练掌握的。当我们需要对查询集(queryset)的某些字段进行计算或进行先分组再计算或排序, 我们就需要使用aggregate和annotate方法了。

  • aggregate

下面代码来源官网

from django.db import models

class Author(models.Model):    name = models.CharField(max_length=100)    age = models.IntegerField()

class Publisher(models.Model):    name = models.CharField(max_length=300)

class Book(models.Model):    name = models.CharField(max_length=300)    pages = models.IntegerField()    price = models.DecimalField(max_digits=10, decimal_places=2)    rating = models.FloatField()    authors = models.ManyToManyField(Author)    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)    pubdate = models.DateField()

class Store(models.Model):    name = models.CharField(max_length=300)    books = models.ManyToManyField(Book)

>>> Book.objects.count()2452

# publisher__name 是 book通过publisher绑定的app下的name字段,写成publisher__name>>> Book.objects.filter(publisher__name='BaloneyPress').count()73

# Average price across all books.>>> from django.db.models import Avg>>> Book.objects.all().aggregate(Avg('price')){'price__avg': 34.35}

# Max price across all books.>>> from django.db.models import Max>>> Book.objects.all().aggregate(Max('price')){'price__max': Decimal('81.20')}

annotate

先介绍F,annotate 必用F

F介绍

-个F()对象表示一个模型字段或注释的列的值。这样就可以引用模型字段值并使用它们执行数据库操作,而无需实际将它们从数据库中拉出到Python内存中

说白了就是我从数据库拿东西,但是有些需要的字段没有,要通过绑定的外键的app的model拿。但是名称又是app__字段来命名,这样我要改名称,而且拿第一次的model,放在python内存中,再拿通过外键绑定的另一个model,又要执行第一次步骤,那个效率就不行了,干嘛我不一起拿,所以会用annotate可以提高效率

from django.db.models import Fbanners = Banner.objects.values('image_url', 'news_id').annotate(news_title=F('news__title')).filter(is_delete=False)

我要拿出image_url,news_id,和news_title,news_title来源banner模型外键绑定news中的title字段,拿出来它叫news__title,我要给它换个名字叫news_title,这就是注释。

django view相关推荐

  1. Django View(视图系统)

    Django View 官方文档 一个视图函数(类),简称视图,是一个简单的 Python 函数(类),它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误 ...

  2. Django View使用装饰器捕获数据库连接异常

    "来不及解释了",直接上代码. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...

  3. Django View和URL

    网页程序的逻辑:request进来 -> 从服务器获取数据 -> 处理数据 -> 把网页呈现出来 url 设置相当于客户端向服务器发出request请求的入口,并用来指明要调用的程序 ...

  4. django view返回form error_Django(解决被钓鱼CSRF、Django中间件、反射)

    今日内容概要 django中间件 全局用户身份校验 全局用户权限校验(补充) 全局访问频率校验 ... csrf跨站请求伪造 基于django中间件一个重要的编程思想(反射) https://www. ...

  5. [django] View类视图

    View--所有类视图的父类 View是所有类视图的父类,包括在之后使用的最重要的DjangoRESTframework中的所有view,都是继承于它.View可以直接从from django.vie ...

  6. Django view(视图)

    在Django MTV模式中,View视图负责业务逻辑部分,路由系统接收到HTTP请求,并将任务分配给相应的视图函数,由视图函数来负责响应这个请求.无论视图本身包含什么逻辑,都要返回响应. 在这里HT ...

  7. django 使用Ajax方式POST JSON数据包

    示例1: js: function SaveAction(){//点击 保存按键var senddata = {"type":"A", "host&q ...

  8. Django项目知识点(四)

    https://mp.weixin.qq.com/s/8yznCfBdbgzy8ZN7tiRTEw 本来今天不想发文的,昨天没发,怪不好意思的 django view URL是Web服务的入口,用户通 ...

  9. django+asyncio资料调研整合

    [1][6][11][13]没啥用 [12]的意思是需要异步的地方使用tornado重新写一个API [5][8]视图函数里面强行塞入事件循环 [7]晚于[2][4][10],与[5][8]的做法完全 ...

最新文章

  1. Angular-Ui-Router+ocLazyLoad动态加载脚本
  2. GsonBuilder
  3. 端口镜像 流量过滤_技术盛宴 | 流量可视化之ERSPAN的前世今生
  4. SpringMvc自定义参数绑定
  5. js基础知识汇总13
  6. messageutil.java_java socket 怎么给websocket发信息
  7. 恒生UFX接口引用计数心得
  8. (算法)2048游戏
  9. ndows 资源管理器,windows资源管理器已停止工作怎么解决
  10. 求平面两圆公切线 切点坐标
  11. arduino esp32 读福申甲醛传感器
  12. C++:实现量化期权交易CDS加密货币衍生品测试实例
  13. 计算机图形学(光线追踪)
  14. 开源电子商城系统:罗列几个电子商城系统,和一个不错的开源电子商城项目:mall,先做技术调研,主要还是学习代码。
  15. 软件测试工程师简历要怎么写,才能让HR看到
  16. 第九天 杭电OJ 1087、1203、1003
  17. IBL 漫反射辐照度
  18. 程序员如何变得更优秀?从业 10 年,我总结了 7 个建议
  19. NAT配置两台Ubuntu通网
  20. php换脸,gif动态图换脸 动态图如何换脸 怎样更换gif动态图的人脸头像

热门文章

  1. c++ scanf输入字符串_在C语言中,你真的搞清楚字符串了吗?
  2. 百度绿色底座亮相 AI原生云低碳前行
  3. 一文让你完全弄懂Stegosaurus
  4. Singleton模式(单例模式) 饿汉式和懒汉式
  5. 20155226 2016-2017-2 《Java程序设计》第一周学习总结
  6. chrome调试找不到 XXXX.min.map 原因及解决办法
  7. 摆脱科技僵尸,回归生龙活虎
  8. sas宏中如何跳出%do循环
  9. flask tutorial = make a blog :) flask 搭建博客系统从零开始!
  10. [Oracle] CPU/PSU补丁安装教程