导航:VS2019开发Django系列

这几天学习了一下Django的视图和模板,从这几天的学习进度来看,视图这里并没有花很多的时间,相反的,模板花费了大量的时间,主要原因还是因为对Jquery操作dom不熟练,其次就是对bootstrap的使用不熟练,所以花了一些时间研究官方文档。

那么,言归正传,先从视图(views.py)开始讲起。Django中视图与其他框架中的视图(尤其是MVC模式)不一样,Django中的视图,用Asp.Net Mvc框架来类比的话,就是Controller,里边的视图函数就是Action,这个在第二篇博文中介绍文件目录结构的时候有提到过,那么我们的请求,要到达一个Controller,然后到达一个Action,需要一个路由表,Django中也是有类似的设计的,只是换了个说法,叫做URL调度器,具体的用法我们可以查看官方文档,文档中会介绍很多的匹配规则,复杂的可以使用正则表达式来配置匹配规则,但是经验告诉我,这个路由规则还是尽可能简洁明了的好,因为如果不是开放给第三方的Api的话,用这个规则的终究是自己,反过来,就算是开放给第三方的Api,搞得太复杂也会让人诟病。当然这只是我的个人见解......

接下来,就到了直接上代码的时候了,看DjangoLazyOrders这个项目中,我的URL配置是怎么配置的:分为两部分,一个是整个应用的URL配置,一个是hello这个App的URL配置,着重看着色部分代码。

#D:\项目\local\DjangoLazyOrders\DjangoLazyOrders\urls.py
urlpatterns = [path('', views.home, name='home'),
path('contact/', views.contact, name='contact'),
path('about/', views.about, name='about'),
path('login/',
LoginView.as_view(template_name='app/login.html',
authentication_form=forms.BootstrapAuthenticationForm,
extra_context=
{
'title': 'Log in',
'year' : datetime.now().year,
}),
name='login'),
path('logout/', LogoutView.as_view(next_page='/'), name='logout'),
path('admin/', admin.site.urls),
path('hello/', include('hello.urls')),]
from django.urls import path,include
from hello import views #D:\项目\local\DjangoLazyOrders\hello\urls.py
urlpatterns = [path('hello/',views.hello,name='hello'),
path('test/',views.test,name='test'),
path('lazy_orders_index/',views.lazy_orders_index,name='lazy_orders_index'),
path('<int:category_id>/category/', include([path('delete/', views.category_delete,name='category_delete'),path('edit/', views.category_edit,name='category_edit')]))]

那么,以上代码代表的规则是什么呢?

1)hello\urls.py中的配置一共展示了有三个视图,分别是lazy_orders_index,category_delete,category_edit,那么,这三个视图分别对应的视图函数该怎么定义呢?直接看代码(部分代码未实现完整):

  • lazy_orders_index 参数request是必须带的,所有的视图函数第一个参数永远是request,因为第一个路由规则没有配置参数,所以只有这个默认的参数
  • category_delete,category_edity有一个公共部分<int:category_id>,删除和编辑需要提供一个参数category_id,所以把公共部分提取出来放到前面,然后再各自匹配各自的规则,delete与edit
import json
from datetime import datetime
from django.core import serializers
from django.shortcuts import render
from django.http import HttpResponse,JsonResponse
from hello.models import Category,Menu # Create your views here.
def hello(request):
return HttpResponse("hello world!") def test(request):
return HttpResponse("test") def category_edit(request,category_id):
return HttpResponse("edit") def lazy_orders_index(request):
categorys = Category.objects.all()#查询所有的类别
menus = Menu.objects.all()#查询所有的菜单 json_categorys = []#定义两个数组 用来保存model的json数据
json_menus = [] for category in categorys:
json_categorys.append({
"category_id":category.category_id,
"category_name":category.category_name#遍历实体对象 构建ViewModel的数据
}) for menu in menus:
json_menus.append({
"category_name":menu.category.category_name,
"menu_name":menu.menu_name
}) context = {'json_categorys': json.dumps(json_categorys),'json_menus':json.dumps(json_menus),'categorys':categorys,'menus':menus,'year':datetime.now().year}
return render(request,'hello/lazyorders.cshtml',context)#将数据和模板传给render函数 渲染成html返回给客户端 def category_delete(request,category_id):
Category.objects.get(pk=category_id).delete()
return JsonResponse({'code':0,'message':'ok'})

2)Django内置的快捷函数

  • render(),将给定的模板与给定的上下文字典组合在一起,并以渲染的文本返回一个 HttpResponse 对象。通俗一点就是将一个request对象,以及指定的模板,和模板中使用到的数据传递给这个函数,函数会将模板渲染成标准的html文本,然后返回给浏览器。
  • redirect(),将一个 HttpResponseRedirect 返回到传递的参数的适当URL。通俗一点就是跳转到指定的URL。

我们在上面的View中已经使用到了render()函数,模板指定的是hello App下的lazyOrders.cshtml文件(后缀之所以为.cshtml上一篇已经做了解释),数据对象context,context中我既给了直接从数据库中查出来的实体对象,又封装了一个ViewModel的json数据传给了模板,为什么要这么做呢?是因为我要在模板中实现两套逻辑,下一篇模板相关的内容会做详细的介绍,这里只是提一下。

3)JsonResponse()

  • 要返回Json数据给前端,可以使用HttpResponse,然后指定content-type为application/json即可,示例代码如下:

    def test(request):
    data = {
    'name': 'dengwei',
    'sex': '男'
    }
    return HttpResponse(json.dumps(data),content_type="application/json")

  • 除了使用上述方法,Django还提供了一个更方便的http响应类,JsonResponse,查看这个类的源代码可以知道,继承自HttpResponse,并且在内部对数据调用了json.dumps()序列化,同时还发现,这个类要求序列化的对象必须是dict类型对象,如果要序列化非dict的对象,必须传递参数safe为false,默认为true
    class JsonResponse(HttpResponse):
    """
    An HTTP response class that consumes data to be serialized to JSON. :param data: Data to be dumped into json. By default only ``dict`` objects
    are allowed to be passed due to a security flaw before EcmaScript 5. See
    the ``safe`` parameter for more information.
    :param encoder: Should be a json encoder class. Defaults to
    ``django.core.serializers.json.DjangoJSONEncoder``.
    :param safe: Controls if only ``dict`` objects may be serialized. Defaults
    to ``True``.
    :param json_dumps_params: A dictionary of kwargs passed to json.dumps().
    """ def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
    json_dumps_params=None, **kwargs):
    if safe and not isinstance(data, dict):
    raise TypeError(
    'In order to allow non-dict objects to be serialized set the '
    'safe parameter to False.'
    )
    if json_dumps_params is None:
    json_dumps_params = {}
    kwargs.setdefault('content_type', 'application/json')
    data = json.dumps(data, cls=encoder, **json_dumps_params)
    super().__init__(content=data, **kwargs)
  • 针对非dict类型的对象做如下测试: 

    def test(request):
    #data = {
    #'name': 'dengwei',
    #'sex': '男'
    #} data = [{
    'name': 'dengwei',
    'sex': '男'
    },{
    'name': '女帝',
    'sex': '女'
    }] return JsonResponse(data)

  • 增加safe参数,赋值为false之后,再次测试,正常返回
    def test(request):
    #data = {
    #'name': 'dengwei',
    #'sex': '男'
    #} data = [{
    'name': 'dengwei',
    'sex': '男'
    },{
    'name': '女帝',
    'sex': '女'
    }] return JsonResponse(data,safe=False)

VS2019 开发Django(八)------视图的更多相关文章

  1. VS2019 开发Django(九)------内置模板和过滤器

    导航:VS2019开发Django系列 紧接上篇,继续介绍Django中的模板,考虑可能篇幅过长,所以分为两部分来讲,今天的主要内容: 1)内置模板和过滤器 母版,继承关系.头部导航和页脚,是需要与其 ...

  2. VS2019 开发Django(六)------Admin中图片上传

    导航:VS2019开发Django系列 该篇继续完善在Django的管理界面上传图片,因为LazyOrders小程序中菜单需要展示图片,而不是一个文本路径,所以我们还需要继续改造一下. 1)安装pil ...

  3. VS2019 开发Django(一)------环境配置

    导航:VS2019开发Django系列 缘起:学习是我一直在做的一件事情,但是,可怕的是不知道学习什么,然后止步不前,安于现状,曾经很长的一段时间,我是不知道学习什么,工作上的事情,其实是相对固定的, ...

  4. VS2019 开发Django(十一)------表单

    导航:VS2019开发Django系列 今天是中华人民共和国成立70周年的日子,普天同庆,看阅兵看得满腔热血,热泪盈眶,祖国都这么优秀了,我要更加努力才行啊! 这个Django系列的文章,没有很深入的 ...

  5. VS2019 开发Django(十)------JavaScript与Django的数据交互

    导航:VS2019开发Django系列 这一篇介绍如何使用BootStrap Table这个组件来绑定渲染数据, 1)先来看一下BootStrap Table是怎么绑定数据的. 通过数据属性 给定da ...

  6. VS2019 开发Django(五)------createsuperuser

    导航:VS2019开发Django系列 上篇我们已经把LazyOrders中用到的C#的实体转成了Django中的Entity,并且已经迁移数据库成功,那么,今天继续介绍Django中内置的数据库操作 ...

  7. VS2019 开发Django(四)------models

    导航:VS2019开发Django系列 继上篇我们匆匆迁移数据库成功之后,又花了一个晚上研究了Django的模型,这里的模型其实就是ORM模型中的Entity,.Net里边用的比较多的有Entity ...

  8. VS2019 开发Django(三)------连接MySQL

    导航:VS2019开发Django系列 下班回到家,洗漱完毕,夜已深.关于Django这个系列的博文,我心中的想法就是承接之前的微信小程序的内容,做一个服务端的管理中心,上新菜单,调整价格啊!之类的, ...

  9. VS2019 开发Django(二)------hello world!

    导航:VS2019开发Django系列 第一篇介绍了安装Django,那么,今天的主题内容是使用VS编写第一个Django应用. 1)新建Django Web项目 选择新建Django Web项目,在 ...

随机推荐

  1. 安卓Android碎片fragment实现静态加载

    静态加载好后的界面如下,两个碎片分别位于一个活动的左边和右边: 左边和右边分别为一个碎片,这两个碎片正好将一整个活动布满.一个活动当中可以拥有多个碎片,碎片的含义就是可以在同一个UI界面下,将这个界面 ...

  2. java之初见

    1.Java语言的了解: Java语言最早是由SUN公司创造出来的,1991年,SUN公司的green项目,Oak,随后SUN公司和后来的甲骨文公司又先后发布了java1.0,1.1,1.2,1.3, ...

  3. 从BWM生产学习工厂模式

    工厂模式应用非常之广,在JDK底层源码以及各大主流框架中随处可见,一般以Factory结尾命名的类,比如Mybatis中的SqlSessionFactory,Spring中的BeanFactory等, ...

  4. Jeewx-Boot 1.1 版本发布,基于SpringBoot的开源微信管家系统

    项目介绍 JeewxBoot是一款基于SpringBoot的开源微信管家系统,采用SpringBoot2.1.3 + Mybatis + Velocity 框架技术.支持微信公众号.微信第三方平台(扫 ...

  5. CentOS 7上利用systemctl添加自定义系统服务

    Centos 7 之 systemctl CentOS 7继承了RHEL 7的新的特性,例如强大的systemctl,而systemctl的使用也使得以往系统服务的/etc/init.d的启动脚本的方 ...

  6. 设置颜色的函数:rgb,hsv,color palettes

    1.grb函数 (1)功能: 通过对给定的三个基本色红,绿,蓝的颜色饱和度(intensity)的设定,而创造颜色. 阿尔法透明度(alpha transparent):其值也能被指定,从0到max ...

  7. 把Git Repository建到U盘上去

    Git很火.原因有三: 它是大神Linus Torvalds的作品,天然地具备神二代的气质和品质: 促进了生产力的发展,Git的分布式版本控制理念,并非首创,但非常适合开源社区的协作方式(不存在mas ...

  8. WebGPU学习(三):MSAA

    大家好,本文学习MSAA以及在WebGPU中的实现. 上一篇博文 WebGPU学习(二): 学习"绘制一个三角形"示例 下一篇博文 WebGPU学习(四):Alpha To Cov ...

  9. PHP数组总汇

    数组,顾名思义,本质上就是一系列数据的组合.在这个组合中,每个数据都是独立的,可以对每个单独的数据进行分配和读取.PHP对数据的操作能力非常强大,尤其是PHP为程序开发人员提供了大量方便.易懂的数组操 ...

  10. js中动画原理

    现如今,许多页面上均有一些动画效果.适当的动画效果可以在一定程度上提高页面的美观度,具有提示效果的动画可以增强页面的易用性. 实现页面动画的途径一般有两种. 一种是通过操作JavaScript间接操作 ...