系列文章目录
初识Django
Django ORM表的创建和增删改查
django请求生命周期流程图和路由层
JsonResponse
前后端不分离
Django写项目(前端直接使用模版程层及模版语法)
前后端分离
Django写项目(前后端使用其他框架和语言)
不同语言使用json格式数据进行交互
#python序列化和反序列化
dunmps()
loads()
#js序列号反序列化
JSON.stringfy()
JSON.parse()
import json
from django.http import JsonRespones
def index(request):
d= {'username':'jason老师','pwd':123,'hubby':[11,22,33]}
l=[11,22,33,44]
#序列化默认会对中文字符做转换
json_str = json.dumps(d) # 序列化默认会对中文字符做转码
return HttpResponse(json_str) #usernamepwdhubby
return JsonResponse(d, json_dumps_params={'ensure_ascii': False}) #{"username": "jason老师", "pwd": "123", "hubby": [11, 22, 22]}
return JsonResponse(l) #报错
在python中一个函数没有return关键字,那么它的返回值就是NOne
类名加括号,产生一个对象
form表单
-
method必须是post
-
enctype参数必须是mutipart/from-data
- request.POST无法获取到文件类型的数据
- request.FILES获取文件类型的数据
前端获取数据
<input type="filt" name="file"> # 只能获取一个 <input type="file" name="file" multiple> #可以一次性获取多个
后端获取文件数据
request.FILES.get() request.FILFES.getlist()
FBV与CBV
FBV 基于函数的视图
def index(request): return HttpResponse(...)
CBV 基于类的视图
- 视图函数可以是类也可以是函数
from django.views import View
class Mylogin(View):
def get(self,request):
return HttpRespones('get请求')
def Post(self,requset):
return HttpResponse('post请求')
url(r'^login/',views.MyLogin.as_view())
CBV源码剖析
函数名或者方法名遇到括号执行优先级最高
对象查找属性或方法的顺序
- 永远都是先从自己身上找
- 然后去产生对象的类中找
- 再去类的父类中找 如果都没有就报错
FBV与CBV在路由上本质其实都一样
都是正则表达式对应函数名
url(r'^login/',views.MyLogin.as_view())
def as_view(cls,**initkwargs):
def view(request,*args,**kwargs):
self = cls(**initkwargs) # 产生一个MyLogin类的对象 obj
return self.dispatch(request, *args, **kwargs)
return view
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)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
模版语法传值
html文件传值
1、字典挨个指名道姓
节省系统资源
2.locals()全部传递
节省人力资源 #学习阶段就是使用这种方式
1.python基本数据类型全部支持模版语法传值
2.在django中模版语法传值之后会自动加括号执行将返回值渲染到页面上
3.针对函数名和对象模版语法传值之后都会先加括号调用
4.针对类名和对象名模版语法传值之后都会先加括号调用
类名加括号产生对象
对象加括号不符合正常的调用方式 还是对象本身
但是会触发产生该对象类中的__call__方法
django模版语法不支持函数传参
当需要引用变量名的时候使用双括号 {{ }}
{{ }} #跟变量名相关
{%%} # 跟功能逻辑相关
模版语法之过滤器
# 相当于python的内置函数
{#<p>过滤器:(|) 将管道符左边的数据当作第一个参数传染过滤器中如果需要第二个参数 则名称后冒号}
<p>统计长度:{{ l|length }}</p>
<p>加法运算:{{ i|add:123 }}</p>
<p>默认值:{{ b|default:'布尔值为False' }}</p>
<p>时间格式:{{ ctime|date:'Y-m-d H:i:s' }}</p>
<p>截取字符(包含三个点):{{ ss|truncatechars:10 }}</p>
<p>截取单词(不包含三个点):{{ ss|truncatewords:3 }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>转义:{{ s1|safe }}</p>
后端也可以转义
from django.utils.safestring import mark_safe
s2 = "<script>alert(123)</script>"
res = mark_safe(s2)
模版语法之标签
<p>标签:其实就是流程控制 if判断 for循环</p>
{% for foo in s %}
{% if forloop.first %}
<p>这是第一次循环</p>
{% elif forloop.last %}
<p>这是最后一次</p>
{% else %}
<p>继续!!!</p>
{% endif %}
{% empty %}
<p>传递过来的数据是空的</p>
{% endfor %}
自定义过滤器、标签,inclusion_tag
# 做一个大致了解即可(使用频率不高)
过滤器相当于python中的内置函数 自定义过滤器相当于python中自定义函数
自定义标签也是
"""
自定义过滤器 标签 inclusion_tag都需要三步走战略
1.在应用文件夹下创建一个名字必须叫templatetags文件夹
2.在创建的文件夹下创建一个任意名称的py文件
3.在该py文件内先固定写两句话
from django import template
register = template.Library()
"""
# 自定义过滤器(无论是内置的还是自定义都只能最多两个参数)
@register.filter(name='haha')
def aaa(a, b):
return a + b
# 自定义标签
@register.simple_tag(name='heihei')
def bbb(a, b, c, d):
return '%s|%s|%s|%s' % (a, b, c, d)
# 自定义inclusion_tag
@register.inclusion_tag('myul.html',name='my_ul')
def my_ul(n):
new_list = []
for i in range(1,n):
new_list.append('第%s次'%i)
return locals()
"""
html页面
{% load mytag %} 一定要先加载才能使用
{{ s|haha:111 }}
{% heihei 1 2 3 4 %}
{% my_ul 10 %}
"""
模板的继承
在母版中使用block划分将来可以修改的区域
<div class="panel-body">
{% block content %}
<div class="jumbotron">
<h1>老徐想去修车 谁来带带他!</h1>
<p>带得好有小费</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">快来加入我们吧!!!</a></p>
</div>
{% include 'menu.html' %}
{% include 'menu.html' %}
{% include 'menu.html' %}
{% endblock %}
</div>
测试环境配置
在test.py中写
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "d19_dj6.settings")
import django
django.setup()
'以上为固定句式'