视图层

小白必会三板斧(三个返回的都是HttpResponse对象,通过看源码,可以知道是内部实现)

1.HttpResponse  # 返回字符串

2.render  # 返回一个html页面 还可以给模板传递
from django.template import Template,Context
def index(request):
res = Template("<h1> {{ user }} </h1>")
con = Context({'user':{'username':'jason','pwd':'123'}})
ret = res.render(con)
print(ret)
return HttpResponse(ret) 3.redirect # 重定向

JsonResponse

作用是返回json格式数据的

为什么要给前端返回json格式字符串?

前后端分离  就是基于json格式传输数据
后端就专门写接口 前端调用你这个接口 就能够拿到一个
json格式的字符串
然后前端利用序列化反序列转换成前端对应的数据类型 前端 后端
JSON.stringify 序列化 >>> json.dumps
JSON.parse 反序列 >>> json.loads

js常用数据类型

数值类型
字符类型
数组 []
自定义对象 {}
undefined与null
布尔值 true false
symbol

JS中的六大数据类型

form表单上传文件

注意事项

1.提交方式必须是post

2.enctype参数必须有默认的urlencoded变成formdata

FBVCBV 以及CBV源码分析


##FBV(Function Based View) 基于函数的视图(就是我们一直写的普通映射函数) ##CBV(Class Based View) 基于类的视图 你在类中写了两个方法 一个叫get一个叫post
为什么前端get请求来就会触发get方法
post请求来就会触发post方法 如何实现的??? # CBV路由 #urls.py
url(r'^reg/',views.MyReg.as_view()) #as_view()的源码
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs) # cls就是我们自己的写的MyReg类
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
# 上面的一通操作 就是给我们自己写的类的对象赋值
return self.dispatch(request, *args, **kwargs)
# 对象在查找属性或方法的时候 顺序是什么?
# 先从自己找 再从产生对象的类中找 再去类的父类中找...
"""也就意味着你在看源码的时候 你一定要牢记上面的话"""
return view # views.py
from django.views import View
class MyReg(View):
def get(self,request):
return render(request,'reg.html') def post(self,request):
return HttpResponse("我是MyReg类中post方法") ***************CBV最精髓的部分****************
def dispatch(self, request, *args, **kwargs):
# 判断当前请求方式在不在默认的八个请求方式中
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
# handler = getattr(自己写的类产生的对象,'小写的请求方法(get\post)',
# '获取不到对应的方法就报错')
# handler就是我们自己定义的跟请求方法相对应的方法的函数内存地址
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # 在调用获取到的方法

django settings源码分析及实际应用

django的配置文件有两个

​ 一个是暴露给用户可以自定义配置的

​ 一个是默认的全局配置文件

​ 用户指定了就用用户的

​ 用户没有指定就用默认的

   from django.conf import settings

   settings = LazySettings()

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

模板传值

传函数名的时候 会自动加括号调用函数 将函数的返回值展示在html页面上

django模板语法不支持函数传参

django模板语法在获取容器类型内部元素的值的时候 统一只采用 句点符(.)

## 过滤器(|)
(前端代码并不一定非要在前端写 你也可以在后端写好 传递给前端页面)
前后端取消转义
方法一:
后端:<p>我是在后端写的</p>
在前端,用过滤器
|safe (告诉前端,我在后端写的前端语句是可以有实际意义的)
方法二:
在后端
from django.utils.safestring import mark_safe
sss2 = "<a href='http://www.xiaohuar.com'>下午上课 需要激情</a>"
res = mark_safe(sss2)
前端
{{res}}
"""
模板语法的符号就两种
{{}} 变量相关
{%%} 逻辑相关 """

## 标签
if判断
for循环 自定义过滤器、标签
步骤:
1 在应用名下面新建一个templatetags文件夹(必须叫这个名字)
2 在改文件夹下 新建一个任意名称的py文件
3 在该py文件内 固定先写两行代码
from django.template import Library
register = Library() 自定义的过滤器 自定义的标签
@register.filter(name='myplus')
def index(a,b):
return a + b
@register.simple_tag(name='mysm')
def login(a,b,c,d):
return '%s/%s/%s/%s'%(a,b,c,d) # 过滤器取值
{% load my_tag %}
{{ 123|myplus:123 }} #标签取值
{% load my_tag %}
{% mysm 1 2 3 4 %} 区别 标签不能再if中使用
{% if 0|myplus:123 %} 可以用
<p>有值</p>
{% endif %}
{% if mysm 1 2 3 4 %} 不能用
<p>有值</p>
{% endif %} ## 几个例子 #例子1
forloop的用法 l= [1,2,3,4,5,6] 是后端传过来的 {% for foo in l %}
{{ forloop.counter }}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次了啊</p>
{% else %}
<p>嗨起来 大宝贝~</p>
{% endif %}
{% endfor %} ##打印结果
1
这是我的第一次
2
嗨起来 大宝贝~
3
嗨起来 大宝贝~
4
嗨起来 大宝贝~
5
嗨起来 大宝贝~
6
这是最后一次了啊 """
forloop.counter 可以作为序号,它不会出现主键删除之后出现断片的效果
""" #例子2
. 取值 #后端代码
yyy = {'user_list':[1,'22',{'username':['jason','egon']}]} #前端
<p>{{ yyy.user_list.2.username.1 }}</p> #上述语句可以取到 egon

模板的继承和导入


事先需要再模板中 通过block划定区域 {% block 区域名字 %} {% endblock %} #例如:在html文件中的下个语句设置为block划定的区域,即在页面右侧划分出来,这块的名字叫content这个就是子板中拿到区域的标识 <div class="panel-body">
{% block content %}
<div class="jumbotron">
<h1>Hello, world!</h1>
<p>...</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
</div>
{% endblock %}
</div> 子板中如何使用
{% extends '模板的名字'%} {% block 区域名字 %}
<h1>登录页面</h1>
{% endblock %}
#例如
{% extends 'home.html' %} {% block content %}
<h1>登录页面</h1>
{% include 'good_page.html' %} #新增的另一个html文件内容
{% endblock %} 一个页面上 block块越多 页面的扩展性越高
通常情况下 都应该有三片区域
{% block css %} {% endblock %} {% block content %} {% endblock %} {% block js %} {% endblock %}
#例如
{% block css %}
<style>
h1 {
color: red;
}
</style>
{% endblock %}
# 用来修饰子板的文字属性 子板中还可以通过
{{ block.super }} 来继续使用母版的内容 #例如子板通过这个语句可以把母版里面的内容加到子板里了,且可以多次加 ## 模板的导入
当你写了一个特别好看的form表单 你想再多个页面上都使用这个form表单
你就可以将你写的form表单当作模块的形式导入 导入过来之后 就可以直接展示 {% include 'good_page.html' %}

django之视图层和部分模板层的更多相关文章

  1. day 45 Django 的初识2 路由层,视图层,模板层

    前情提要: 今天继续学习Django 的内容, 今天主要和渲染相关 1>配置路由 >2:写函数 >3 指向url 一:路由层 1:配置静态支持文件 1:路由层的简单配置 >dj ...

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

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

  3. Django-1版本的路由层、Django的视图层和模板层

    一.Django-1版本的路由层(URLconf) URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:我们就是以这种方式告诉Dja ...

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

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

  5. Django之视图层与模板层

    目录 视图层 小白必会三板斧 HttpResponse render redirect JsonResponse 前后端分离 FBV CBV 给CBV加装饰器 模板层 模板语法 模板传值 过滤器 语法 ...

  6. Django系列(二):Django的路由层,视图层和模板层

    1.Django的路由层 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:我们就是以这种方式告诉Django,对于客户端发来的某 ...

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

    目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV ...

  8. django 之视图层及模板层 04

    目录 视图层 render方法是Template和Contex两个对象的组合使用 JsonResponse对象 CBV及源码分析 CBV 加装饰器的方式 模板层 模板语法传值 模板语法 变量 过滤器( ...

  9. Django 视图层和模板层

    目录 一.网站首页和404页面的路由配置 1. 网站首页路由 2. 404页面 二.Django视图层 1. 小白必会三板斧 (1)HttpResponse (2)render (3)redirect ...

随机推荐

  1. c++类的学习笔记

    用结构体数据的安全性得不到保证. 使用类对数据进行封装,只能通过函数修改类中的数据 (1)类的定义 class 类名 { private: protected: public: }; private: ...

  2. ORB-SLAM2 地图保存

    一.简介 在ORB-SLAM2的System.h文件中,有这样一句话:// TODO: Save/Load functions,让读者自己实现地图的保存与加载功能.其实在应用过程中很多场合同样需要先保 ...

  3. NAT技术详解

    一.IPv4协议和NAT的由来 1.IPv4协议介绍 2011年2月3日,IANA宣布:IPv4地址空间最后5个地址块已经被分配给下属的5个地区委员会.2011年4月15日,亚太区委员会APNIC对外 ...

  4. Linux环境变量配置方法

    Linux上环境变量配置分为设置永久变量和临时变量两种.环境变量设置方法同时要考虑环境Shell类型,不同类型的SHELL设置临时变量方法和设置永久变量对应的配置文件不同.Linux环境变量本身配置过 ...

  5. Win10中SVN图标不显示的解决

    团队协作开发,SVN是离不开的.在Win10安装的版本是TortoiseSVN-1.9.5.27581,可检出后图标未显示出来.解决方法是修改注册表: 第一步,打开注册表编辑器位置:HKEY_LOCA ...

  6. IM开发者的零基础通信技术入门(三):国人通信方式的百年变迁

    [来源申明]本文原文来自:微信公众号“鲜枣课堂”,官方网站:xzclass.com,原题为:<中国通信的百年沉浮>,本文引用时已征得原作者同意.为了更好的内容呈现,即时通讯网在收录时内容有 ...

  7. 浅谈javascript引擎执行代码的步骤-(2019-2)

    平时面试经常会遇到类似下面的这种题,而且千变万化,让人一个头两个.示例这道题算是稍微有点难度的了,这种题考查的是JavaScript引擎执行代码的步骤. b = 'cba'; function a(a ...

  8. vue 移动端禁止浏览器后退,禁止安卓和ios点击后退操作乱跳页面

    开发微信公众号网页,页面登录成功之后,是禁止再次返回到登录页. 我在页面设置了让禁止跳到登录页,可是在手机上有自带的微信浏览器后退按钮,所以必须要禁止浏览器后退,才能禁止后退到登录页. 刚开始百度,查 ...

  9. 【前端知识体系-JS相关】对移动端和Hybrid开发的理解?

    1.hybrid是什么,为何使用hybrid呢? 概念: hybrid就是前端和客户端的混合开发 需要前端开发人员和客户端开发人员配合完成 某些环节也可能会涉及到server端 大前端:网页.APP. ...

  10. 2019-11-25-win10-uwp-发布旁加载自动更新

    原文:2019-11-25-win10-uwp-发布旁加载自动更新 title author date CreateTime categories win10 uwp 发布旁加载自动更新 lindex ...