django view
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相关推荐
- Django View(视图系统)
Django View 官方文档 一个视图函数(类),简称视图,是一个简单的 Python 函数(类),它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误 ...
- 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 ...
- Django View和URL
网页程序的逻辑:request进来 -> 从服务器获取数据 -> 处理数据 -> 把网页呈现出来 url 设置相当于客户端向服务器发出request请求的入口,并用来指明要调用的程序 ...
- django view返回form error_Django(解决被钓鱼CSRF、Django中间件、反射)
今日内容概要 django中间件 全局用户身份校验 全局用户权限校验(补充) 全局访问频率校验 ... csrf跨站请求伪造 基于django中间件一个重要的编程思想(反射) https://www. ...
- [django] View类视图
View--所有类视图的父类 View是所有类视图的父类,包括在之后使用的最重要的DjangoRESTframework中的所有view,都是继承于它.View可以直接从from django.vie ...
- Django view(视图)
在Django MTV模式中,View视图负责业务逻辑部分,路由系统接收到HTTP请求,并将任务分配给相应的视图函数,由视图函数来负责响应这个请求.无论视图本身包含什么逻辑,都要返回响应. 在这里HT ...
- django 使用Ajax方式POST JSON数据包
示例1: js: function SaveAction(){//点击 保存按键var senddata = {"type":"A", "host&q ...
- Django项目知识点(四)
https://mp.weixin.qq.com/s/8yznCfBdbgzy8ZN7tiRTEw 本来今天不想发文的,昨天没发,怪不好意思的 django view URL是Web服务的入口,用户通 ...
- django+asyncio资料调研整合
[1][6][11][13]没啥用 [12]的意思是需要异步的地方使用tornado重新写一个API [5][8]视图函数里面强行塞入事件循环 [7]晚于[2][4][10],与[5][8]的做法完全 ...
最新文章
- Angular-Ui-Router+ocLazyLoad动态加载脚本
- GsonBuilder
- 端口镜像 流量过滤_技术盛宴 | 流量可视化之ERSPAN的前世今生
- SpringMvc自定义参数绑定
- js基础知识汇总13
- messageutil.java_java socket 怎么给websocket发信息
- 恒生UFX接口引用计数心得
- (算法)2048游戏
- ndows 资源管理器,windows资源管理器已停止工作怎么解决
- 求平面两圆公切线 切点坐标
- arduino esp32 读福申甲醛传感器
- C++:实现量化期权交易CDS加密货币衍生品测试实例
- 计算机图形学(光线追踪)
- 开源电子商城系统:罗列几个电子商城系统,和一个不错的开源电子商城项目:mall,先做技术调研,主要还是学习代码。
- 软件测试工程师简历要怎么写,才能让HR看到
- 第九天 杭电OJ 1087、1203、1003
- IBL 漫反射辐照度
- 程序员如何变得更优秀?从业 10 年,我总结了 7 个建议
- NAT配置两台Ubuntu通网
- php换脸,gif动态图换脸 动态图如何换脸 怎样更换gif动态图的人脸头像
热门文章
- c++ scanf输入字符串_在C语言中,你真的搞清楚字符串了吗?
- 百度绿色底座亮相 AI原生云低碳前行
- 一文让你完全弄懂Stegosaurus
- Singleton模式(单例模式) 饿汉式和懒汉式
- 20155226 2016-2017-2 《Java程序设计》第一周学习总结
- chrome调试找不到 XXXX.min.map 原因及解决办法
- 摆脱科技僵尸,回归生龙活虎
- sas宏中如何跳出%do循环
- flask tutorial = make a blog :) flask 搭建博客系统从零开始!
- [Oracle] CPU/PSU补丁安装教程