视图层

小白必会三板斧(三个返回的都是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. MySQL 行溢出数据

    MySQL 行溢出数据 MySQL 对一条记录占用的最大储存空间是有限制的,除了 BLOB 和 TEXT 类型之外,其他所有列 (不包括隐藏列和记录头信息) 占用的字节长度不能超过 65535 个字节 ...

  2. Project Euler Problem 675

    ORZ foreverlasting聚聚,QQ上问了他好久才会了这题(所以我们又聊了好久的Gal) 我们先来尝试推导一下\(S\)的性质,我们利用狄利克雷卷积来推: \[2^\omega=I\ast| ...

  3. (十八)golang--defer关键字

    在函数中,程序员经常需要创建资源(比如,数据库连接,文件句柄,锁等),为了在函数执行完毕后,及时释放资源,go设计者提供defer(延时机制) 用defer申明的语句不会立即执行,而是被存入到defe ...

  4. multer 基础教程(英文版)

    Multer is a node.js middleware for handling multipart/form-data, which is primarily used for uploadi ...

  5. mysql8

    解决navicat不能连接问题: grant all privileges on *.* to ‘root’@’%’;ALTER USER 'root'@'localhost' IDENTIFIED ...

  6. NXP官方ddr_stress_tester工具使用

    1.前言 NXP官方提供了一个DDR初始化工具,名称为ddr_stress_tester,该工具具有以下特点: 该工具能通过USB OTG接口与目标板进行连接,通过USB OTG接口完成DDR的初始化 ...

  7. YY工具隐私政策

    YY工具(以下简称“我们”)深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠.我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则.目的明确原则.选择同意原则.最少够 ...

  8. 【前端知识体系-JS相关】组件化和React

    1. 说一下使用jQuery和使用框架的区别? 数据和视图的分离,(jQuery数据和视图混在一起,代码耦合)-------开放封闭原则 以数据驱动视图(只关注数据变化,DOM操作被封装) 2.说一下 ...

  9. Python保存json文件并格式化

    使用json.dump()的时候设置一下indent参数的值就好了.比如json.dump(json_dict, f, indent=4), ensure_ascii=False,写入中文

  10. Window权限维持(一):注册表运行键

    在红队行动中在网络中获得最初的立足点是一项耗时的任务.因此,持久性是红队成功运作的关键,这将使团队能够专注于目标,而不会失去与指挥和控制服务器的通信.在Windows登录期间创建将执行任意负载的注册表 ...