视图层

小白必会三板斧

HttpResponse

render
from django.template import Template,Context
temp = Template("

{{ user }}

")
con = Context({"user":[1,2,3,4]})
res = temp.render(con)
return HttpResponse(res)

redirect

JsonResponse
返回一个json格式的字符串

前后端分离
后端给前端返回一个json的格式的字符串(大字典)

1.可以自己手动json序列化
import json
class MyJsonEncode(json.JsonEncode):
pass
json.dumps(data,cls=MyJsonEncode,ensure_ascii=False)

2.JsonResponse
内部其实也是调了json.dumps
JsonResponse(data,json_dumps_param={"ensure_ascii":False},safe=False)

form表单上传文件
1.提交方式必须是post
2.需要将form标签的enctype属性由默认的urlencoded改为formdata

后端需要从request.FILES中获取上传的文件

django内部针对不同数据格式的数据 会解析到不同的方法中
request.GET
request.POST
request.FILES

FBV与CBV
基于函数/类的视图

CBV
写视图函数 必须要写一个类 然后继续View
from django.views import View
class MyLogin(View):
def get(self,request):
return render(request,'login.html')

def post(self,request):
return HttpResponse('post请求')

路由配置
CBV源码
FBV
url(r'^index/',views.index)
CBV
url(r'^login/',views.MyLogin.as_view())
# url(r'^login/',views.view)

def as_view(cls,*args,**kwargs):
def view(...):
self = cls(...)

return self.dispatch(...)
return view

def dispatch(...):
# 判断当前请求方式在不在八个默认的请求方式中 get post delete options ...
# 利用反射 获取对象的所对应的属性或者是方法
# 执行对应方法

django settings源码
django暴露给用户一个自定义配置的文件
用户配置了就用用户的 用户没有配置就使用默认的 并且配置文件中的变量名必须是大写才有效
from django.conf import settings

settings = LazySettings()

class LazySettings(object):
...

class Settings(object):
# 循环获取默认的配置文件中所有的大写配置
# 利用setattr给对象不停的设置键值对
# 再循环获取暴露给用户的自定义配置文件中所有的大写的配置
# 再利用setattr给对象不停的设置键值对
"""字典的键存在的情况 再设值其实就是替换"""

模板层
{{}} 变量相关
{%%} 逻辑相关

模板语法传值
python基本数据类型
函数名 # 传函数名 会自动加括号调用 不支持传参
对象

模板语法获取容器类型的数据 只能采用句点符(.)
点索引
点键

模板语法之过滤器(|)

会将|左边的值当作第一个参数传入 右边的当作第二个参数传入
|add
|default
|length
|slice
|truncatechars # 截字符 三点也算
|truncatewords # 按空格截 三点不算
|filesizeformat
|safe

前端
|safe
后端
from django.utils.safestring import mark_safe

res = mark_safe("

111

")
"""前端代码不一定必须要在前端写好 也可以再后端写完 传递给前端页面"""
只要思想不滑坡 方法总比困难多

模板语法之标签
{%%}
if判断 后端语法一模一样
for循环
内部提供了一个forloop对象
counter # 1开始
counter0 # 0开始
first
last
empty 当for循环对象是个空的时候 就会走empty下面的逻辑

with起别名 当一个数据是通过很复杂的方式获取到 好多地方有需要用

keys,values,items

自定义过滤器和标签
1.在应用下新建一个名字必须叫templatetags文件夹
2.在该文件夹下新建一个任何名称的py文件
3.在该py文件中 先固定写两行代码
from django.template import Library

register = Library()

@register.filter(name='过滤器的名字')
def index(a,b):
# 过滤器内部逻辑代码
... # ...等价于pass

@register.simple_tag(name='标签的名字')
def login(a,b,c,*args):
...

模板的继承
很多页面的大部分区域长的都差不多的情况下 你可以考虑使用模板的继承
1,在你想用的那个页面上 通过block事先划定 你将来可能用得到的区域
{% block 名字 %}
模板内容
{% endblock %}
2,子板需要先继承模板 才能用到该模板中 事先划定的区域
{% extends 模板的名字 %}
{% block 名字 %}
子板内容

一个模板页面通常应该有三个区域

{% endblock %}

{% block content %}

{% endblock %}

{% block js %}

{% endblock %}

模板的导入
通常情况下是将页面上的某一块区域当作一个模块

posted on 2019-10-24 16:49  黑糖A  阅读(118)  评论(0)    收藏  举报