Django基础之视图(views)层、模板层

JsonResponse

​ 返回一个json格式数据

​ 为什么要给前端返回一个json字符串?

​ 答:前后端分离就是基于json格式传输数据 前端调用接口 就能够拿到json格式的字符串,然后前端利用序列化(json.stringify)反序列化(json.parse)转换成前端对应的数据类型

向前端返回一个json格式字符串的两种方式

方式一:

  1. import json
  2. def my_view(request,ensure_ascii=True):
  3. data = ['jsaon','yjy']
  4. return HttpResponse(json.dumps(data))
  5. #ensure_ascii=True可以不会把中文序列化,可以将中文正常显示

方式二:

  1. from django.http import JsonResponse
  2. def my_view(request):
  3. data = ['jsaon','yjy']
  4. return JsonResponse(datasafe=False)
  5. #默认safe=True代表只能序列化字典对象,safe=False可以序列化字典以外的对象

重写Django中的json的某个方法

重写Django中的json的某个方法让他也能够序列化datetime

  1. class MyJsonClass(json.JSONENcoder):
  2. def default(self,o):
  3. if isinstance(o,datetime):
  4. return o.strftime('%Y-%m-%d')
  5. else:
  6. super().default(self,0)
  7. d = {'ctime':datetime.today()}
  8. print(json.dump(d,cls= MyJsonClass))

form表单上传文件

注意事项:

  • 提交方式必须是post
  • method属性需要由默认的get变成post
  • enctype参数必须有默认的urlencoded变成formdata

视图层

  1. def up(request):
  2. if request.method == "POST":
  3. print(request.POST)
  4. print(request.FILES)
  5. #获取文件对象
  6. fille_obj = request.FILES.get('myfile')
  7. print(file_obj.name)
  8. with open(file_obj.name,'wb') as f:
  9. for chunk in fille_obj.chunks():
  10. f.write(chunk)
  11. return render(request,'up.html')

前端页面

  1. <form action="" method="post" enctype="multipart/form-data">
  2. <input type="file" name="myfile">
  3. </form>

FBV与CBV

FBV与CBV

FBV

基于函数的视图,一直介绍的是FBV

CBV

  1. url(r'^reg/',views.MyReg.as_view())

基于类的视图

urls.py

  1. from django.urls import path,register_converter
  2. from app01 import views
  3. url = [
  4. url('r^login/',view.MyReg.as_view())
  5. ]
  6. #必须调用类下的方法as_view

views.py

  1. from django.views import View
  2. class MyReg(View):
  3. def get(self,request):
  4. return render(request,'reg.html')
  5. def post(self,request):
  6. return HttpResponse("我是MyReg类中post方法")

CBV最精髓的部分

  1. def dispatch(self, request, *args, **kwargs):
  2. if request.method.lower() in self.http_method_names: # 判断当前请求方式在不在默认的八个请求方式中
  3. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
  4. # handler = getattr(自己写的类产生的对象,'小写的请求方法(get\post)','获取不到对应的方法就报错')
  5. # handler就是我们自己定义的跟请求方法相对应的方法的函数内存地址
  6. else:
  7. handler = self.http_method_not_allowed
  8. return handler(request, *args, **kwargs) # 在调用获取到的方法
  9. django settings源码分析及实际应用(你可以不掌握 但是我希望你掌握思路)
  10. django的配置文件有两个
  11. 一个是暴露给用户可以自定义配置的
  12. 一个是默认的全局配置文件
  13. 用户指定了就用用户的
  14. 用户没有指定就用默认的

Django settings源码分析及实际应用

Django的配置文件有两个

一个是暴露菇用户可以自定义的

一个是全局的配置文件

用户指定了就用用户的,没有指定就用全局的

  1. from django.conf import settings
  2. settings = LazySettings()
  3. class LazySettings(LazyObject):
  4. def _setup(self, name=None):
  5. # os.environ你可以把它看成是一个全局的大字典
  6. settings_module = os.environ.get(ENVIRONMENT_VARIABLE) # 从大字典中取值
  7. # settings_module = 'day59.settings'
  8. self._wrapped = Settings(settings_module) # Settings('day59.settings')
  9. class Settings(object):
  10. def __init__(self, settings_module): # settings_module = 'day59.settings'
  11. for setting in dir(global_settings): # 循环获取global_settings文件中所有的名字
  12. if setting.isupper(): # 在判断名字是否是大写
  13. # 如果是大写 利用反射 获取到大写的名字所对应的值 不停地添加到对象中
  14. setattr(self, setting, getattr(global_settings, setting))
  15. # store the settings module in case someone later cares
  16. self.SETTINGS_MODULE = settings_module
  17. mod = importlib.import_module(self.SETTINGS_MODULE) # 'day59.settings'
  18. # from day59 import settings
  19. # mod 指代的就是暴露给用户的配置文件模块名
  20. for setting in dir(mod): # 循环获取暴露给用户配置文件中所有的名字
  21. if setting.isupper(): # 判断是否是大写
  22. setting_value = getattr(mod, setting) # 如果是大写 获取大写的变量名所对应的值
  23. setattr(self, setting, setting_value) # 不停的给对象设置值

模板传值

模板传值可以传数字、字符串、字典、集合、列表、函数、类等

如果传递给 前端一个函数名,会直接加括号调用,将返回值展示到页面上

Django模板语法不支持传参

Django模板语法在获取容器类型内部元素的值得时候只能通过句点符取值

过滤器(|)

过滤器有点类似于小的内置方法

特点:会将|左边的当做过滤器的第一个元素,会将|右边的当做过滤器的第二个元素

eg:

add:加

  1. <p>{{n|add:100}}</p>

length:长度

filesizeformat:文件转大小

truncatechars:6截取6个字符,3个点也算

truncatewords:6截取单词,按照空格截取,3个点不算

slice:0:3:对列表进行索引取值,还可以支持步长

date:'Y-m-d' 时间格式转换

前端:

safe前后端取消转义

后端:

from django.utils.safestring import mark_safe

res=makesafe(变量名),把res传到前端

default:你给我的值是空的:有值就传值,没值就用后面默认的

注意:

  1. 模板语法的符号就两种
  2. {{}} 变量相关
  3. {%%} 逻辑相关

标签

前端if 标签

  1. {% if n %}
  2. <p>n有值</p>
  3. {% else %}
  4. <p>n没有值</p>
  5. {% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

  1. {% if n %}
  2. <p>n有值</p>
  3. {% elif m%}
  4. <p>m有值</p>
  5. {% else %}
  6. <p>没有值</p>
  7. {% endif %}

前端for标签

遍历每一个元素

  1. {% for person in person_list %}
  2. <p>{{ person.name }}</p>
  3. {% endfor %}

循环序号可以通过{{ forloop }}显示 

  1. forloop.counter0 当前循环的索引值(从0开始)
  2. forloop.revcounter 当前循环的倒序索引值(从1开始)
  3. forloop.revcounter0 当前循环的倒序索引值(从0开始)
  4. forloop.first 当前循环是第一次循环则返回True,否则返回False
  5. forloop.last 当前循环是最后一次循环则返回True,否则返回False
  6. forloop.parentloop 本层循环的外层循环
  1. {% for foo in l %}
  2. {% if forloop.first %} #forloop.first为True的时候
  3. <p>这是我的第一次</p>
  4. {% elif forloop.last %} #forloop.last为True的时候
  5. <p>这是最后一次了啊</p>
  6. {% else %}
  7. <p>嗨起来 大宝贝~</p>
  8. {% endif %}
  9. {% endfor %}

for标签可以带有一个可选的{% empty %} 从句,在变量xo为空或者没有被找到时,则执行empty子句

  1. {% for foo in xo %}
  2. <p>{{ forloop.counter }}:{{ foo }}</p>
  3. {% empty %}
  4. <p>你给我的对象是个空的没法进行for循环</p>
  5. {% endfor %}

还可以循环字典中的键值对,键、值

  1. {% for foo in d.items %}
  2. <p>{{ foo }}</p>
  3. {% endfor %}
  4. {% for foo in d.keys %}
  5. <p>{{ foo }}</p>
  6. {% endfor %}
  7. {% for foo in d.values %}
  8. <p>{{ foo }}</p>
  9. {% endfor %}

前端with标签

with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值,如果你要重复利用一个很复杂的值,你就可以给这个值起一个别名,到时候直接用别名就好了

  1. {% with li.1.upper as v %}
  2. {{ v }}
  3. {% endwith %}

自定义过滤器、标签

步骤:(******)

  • 在应用名下面新建一个templatetags文件夹(必须)
  • 在该文件夹下新建一个任意名称的py文件
  • 在该py文件内 固定先写两行代码
  1. from Django.template import Library
  2. register = Library()

自定义的过滤器

自己新建的文件

  1. @registe.filter(name = 'myplus')
  2. def index(a,b):
  3. return a+b

前端页面

  1. {% load my_tag %}
  2. {{123|myplus:123 }}

自定义标签

自己新建的文件

  1. @registe.simple_tag(name = 'mysm')
  2. def login(a b c d):
  3. return '%s %s %s %s'%(a b c d)

前端页面

  1. {% mysm 1 2 3 4 %}

自定义的过滤器和自定义标签

自定义的过滤器可以在if中使用,自定义标签不能在if中使用。

eg:

  1. {% if 0|myplus:123 %} 可以用
  2. <p>有值</p>
  3. {% endif %}
  1. {% if mysm 1 2 3 4 %} 不能用
  2. <p>有值</p>
  3. {% endif %}

模板的继承

事先需要在模板中通过block划定区域

  1. {% block 区域名字 %}
  2. 标签。。。
  3. {% endblock %}

子板中先继承模板

  1. {% extends '想要继承的页面名字'%}
  2. {% block 区域名字 %}
  3. <h1>登录页面</h1>
  4. 。。。
  5. {% endblock %}

一个页面上 block块越多 页面的扩展性越高,通常情况下,都应该有三片区域

  1. {% block css %}
  2. {% endblock %}
  3. {% block content %}
  4. {% endblock %}
  5. {% block js %}
  6. {% endblock %}

子板中还可以通过{{ block.super }} 继续使用母板的内容

模板的导入

当你写了一个特别好看的form表单,你想再多个页面上都使用这个form表单,你就可以将你写的form表单当作模块的形式导入 ,导入过来之后,就可以直接展示

  1. {% include 'good_page.html' %}

Django请求生命周期

Django基础之视图(views)层、模板层的更多相关文章

  1. 【Django笔记1】-视图(views)与模板(templates)

    视图(views)与模板(templates) 1,视图(views) ​ 将接收到的数据赋值给模板(渲染),再传递给浏览器.HTML代码可以直接放在views.py(文件名可任意更换),也可以放在t ...

  2. Django 的路由层 视图层 模板层

    --------------------------------------------------------------通过苦难,走向欢乐.——贝多芬 Django-2的路由层(URLconf) ...

  3. Django:(2)视图层&模板层

    视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . ...

  4. DjangoMTV模型之视图层views及模板层template

    Django视图层中views的内容 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容(render),也可以是一个重定向( ...

  5. Django基础,Day4 - views 详解

    在Django中,网页和其他内容是通过视图传递的.每个视图由一个简单的Python函数表示,Django将通过检查请求的URL(准确地说,是域名后面的部分URL)来选择一个视图. 例如,用户在浏览器中 ...

  6. 3.Django| 视图层| 模板层

    1.视图函数 文件在view_demo 一个视图函数简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XM ...

  7. Django基础之视图

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

  8. django 中的视图(Views)

    Views Django中views里面的代码就是一个一个函数逻辑, 处理客户端(浏览器)发送的HTTPRequest, 然后返回HTTPResponse, http请求中产生两个核心对象: http ...

  9. Django入门3:视图views

    1.获取用户请求数据 1.1 request.GET 获取request.method='GET'的数据 request.GET.get('name',None) 1.2 request.POST 获 ...

随机推荐

  1. 20191114-4 Beta发布用户使用报告

    20191114-4 Beta发布用户使用报告 此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/10007 组名:胜利点 组 ...

  2. laravel 先orderBY再groupby,导致分组后的排序不正确

    //联系过我的经纪人 $appletChats=$this->AppletChat->orderBy('created_at','desc')->where([['user_id', ...

  3. Java——重写hashCode()和euqals()方法

    1.顺序表的问题 查找和去重效率较低 对于这样的顺序表来说,如果需要查找元素,就需要从第一个元素逐个检查,进行查找.对于需要去重的存储来说,每次存入一个元素之前,就得将列表中的每个元素都比对一遍,效率 ...

  4. Linux配置Key,禁止root实现免密码登陆

    前言:        我所理解的是Key登陆认证方式,其实就是拿私钥去解密公钥,私钥需要自己妥善保管,公钥可以随意公开. 废话少说,准备2台服务器,Server1:192.168.1.1   Serv ...

  5. JavaScript日常学习3

    JavaScript函数  函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname()     {执行代码} function myFunct ...

  6. win10下用Anaconda安装TensorFlow | 后附JetBrains测试

    从意识上认识Anaconda(音标:[ˌænəˈkɑ:ndə])/(拼读:安娜康达). Anaconda:水蟒的意思,如图logo像不像水蟒.其最后五个字母是conda(包管理器),而Anaconda ...

  7. php中应用memcached

    PHP连接Memcached 先安装php的memcache扩展 # wget  http://ip/data/attachment/forum/memcache-2.2.3.tgz# tar zxf ...

  8. vue-template-compiler作用

    vue-template-compiler的作用是什么: 看起来 template-compiler是给parse函数使用的, 那么parse函数是干什么的呢 先看一下parse的结果: 结论:使用v ...

  9. windows修复失效图标

    taskkill /im explorer.exe /fcd /d %userprofile%\appdata\localdel iconcache.db /astart explorer.exeex ...

  10. Python:Base3(函数,切片,迭代,列表生成式)

    1.Python之调用函数: Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数 abs,它接收一个参数. 可以直接从Python的官方 ...