Django学习笔记(下)
Posted 南枝向暖北枝寒MA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django学习笔记(下)相关的知识,希望对你有一定的参考价值。
文章目录
18 Template概念
概念:模板
在Django框架中,模板是可以帮助开发者快速生成,呈现给用户页面的工具。模板的设计方式实现了我们MVT中VT的解耦,VT有着N:M的关系,一个V可以调用任意T,一个T可以供任意V使用。
模板处理分为两个过程
加载
渲染
模板中的动态代码段除了做基本的静态填充,可以实现一些基本的运算,转换和逻辑。早期的web服务器,只能处理静态资源请求;模板能处理动态资源请求,依据计算能生成相应的页面。
注意:Django的模板语言是Django模板,flask的模板语言是jinja2模板
模板组成:模板主要有2个部分
(1) html静态代码
(2) 动态插入的代码段(挖坑,填坑)
19 模版语法
19.1 变量
变量:视图传递给模板的数据
获取视图函数传递的数据使用{{ var }}接收
遵守标识符规则:
拒绝关键字、保留字、数字……如果变量不存在,则插入空字符串
来源:
视图中传递过来的
标签中,逻辑创建出来的
19.2 点语法
views.py
def testPoint(request):
a = Animal.objects.first()
hobby = {
'eat': '肉',
'play': '篮球'
}
animal_list = Animal.objects.all()
context = {
'a': a,
'hobby': hobby,
'animal_list': animal_list
}
return render(request, 'testPoint.html', context=context)
testPoint.html
<body>
{{ a.name }} {# 属性 #}
<br>
{{ a.getName }} {# 方法 #}
<br>
{{ hobby.eat }} {# 字典中key对应的值 #}
<br>
{{ animal_list.0.name }} {# 索引 #}
<br>
{{ animal_list.2.name }}
</body>
弊端:模板中的小弊端,调用对象的方法,不能传递参数。为什么不能传递参数,因为连括号都没有。
19.3 标签
特征:标签分为单标签和双标签
双标签必须闭合
功能标签
·for循环
<ul>
{% for a in a_list %}
<li>{{ a.name }}</li>
{% endfor %}
</ul>
<hr>
<ul>
{% for a in a_list123 %}
<li>{{ a.name }}</li>
{% empty %}
判断之前的代码有没有数据 如果没有,显示empty下面的代码
{% endfor %}
</ul>
·forloop
{% for a in a_list %}
{{ forloop.counter }} {# 表示当前是第几次循环,从1开始 #}
{# {{ forloop.counter0 }} {# 表示当前是第几次循环,从0开始 #}
{# {{ forloop.revcounter }} {# 表示当前是第几次循环,倒着数数,到1停 #}
{# {{ forloop.revcounter0 }} {# 表示当前第几次循环,倒着数,到0停 #}
{# {{ forloop.first }} {# 是否是第一个 布尔值 #}
{# {{ forloop.last }} {# 是否是最后一个 布尔值 #}
{% endfor %}
·if
<ul>
{% for a in a_list %}
{% if forloop.first %}
<li style="color: green">{{ a.name }}</li>
{% elif forloop.last %}
<li style="color: red">{{ a.name }}</li>
{% else %}
<li>{{ a.name }}</li>
{% endif %}
{% endfor %}
</ul>
注释
<!-- 这是一个注释 --> 这种注释不推荐,用户检查的时候可以看见
单行注释
{# 单行注释 #}
多行注释
{% comment %}
这是多行
注释
{% endcomment %}
乘
widthratio
{% widthratio 数 分母 分子 %}
{{ num }} {# 5 #}
{% widthratio num 1 5 %} {# 25 #}
{% widthratio num 5 1 %} {# 1 #}
整除
奇偶行变色
<ul>
{% for a in a_list %}
{% if forloop.counter|divisibleby:2 %}
<li style="color: red">{{ a.name }}</li>
{% else %}
<li style="color: blue">{{ a.name }}</li>
{% endif %}
{% endfor %}
</ul>
ifequal
不会忽略类型,code=10 和 code='10' 不一样。
{# 判断code的值是否为10 #}
{% ifequal code 10 %}
yes
{% else %}
no
{% endifequal %}
过滤器
views.py
def testFilter(request):
# js脚本,修改页面中的内容
code1 = '''
<script type="text/javascript">
var li_list = document.getElementsByTagName('li');
for(var i = 0; i < li_list.length; i++){
li_list[i].innerHTML = '好好学习';
}
</script>
'''
a_list = Animal.objects.all()
context = {
'num': 10,
'code': 'FGhdsA',
'a_list': a_list,
'code1': code1
}
return render(request, 'testFilter.html', context=context)
testFilter.html
<body>
过滤器<br>
{{ num }}<br>
{{ num|add:10 }}<br> {# 加 #}
{{ num|add:-10 }}<br> {# 减 #}
{{ code|lower }}<br> {# 全部变小写 #}
{{ code|upper }}<br> {# 全部变大写 #}
<ul>
{% for a in a_list %}
<li>{{ a.name }}</li>
{% endfor %}
</ul>
{#{{ code1|safe }}#}
{% autoescape off %} {# 和safe的作用一样,off表示生效,on表示失效 #}
{{ code1 }}
{% endautoescape %}
</body>
结构标签
block
块/坑,用来规划页面布局,填充页面,默认会覆盖
{% block content %}
tom
{% endblock %}
不被覆盖
{% block header %}
{{ block.super }}
jack
{% endblock %}
extends
继承,面向对象的体现,提高模板的复用率
{% extends 'base_a.html' %}
include
包含,将其它模板作为一部分,包裹到我们的页面中
{% block footer %}
{{ block.super }}
{% include 'base_c.html' %}
{% endblock %}
加载静态资源
1. 手动创建文件夹static,在static下创建css等文件夹。
2. 在settings.py的最后面添加
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
3. 在html中引入css
方式一
硬编码,不推荐。
<link rel="stylesheet" href="/static/css/testCss.css">
方式二
在html的第一行添加
{% load static %}
然后<link rel="stylesheet" href="{% static 'css/testCss.css' %}">
坑点:仅在DEBUG模式下可以使用,如果settings中的DEBUG=False,那么是不可以使用方式二。
20 常见的请求状态码
请求状态码
2xx
成功
3xx
302 重定向 301 永久重定向
4xx
客户端错误
5xx
服务端错误
200 成功
301 永久重定向 302 重定向
403 防止跨站攻击 404 路径错误 405 请求方式
500 业务逻辑错误
21 view视图函数
21.1 概念及基础语法
概念:视图函数是MTV中的View,相当于MVC中的Controller作用,控制器,接收用户请求,协调模板模型,对数据进行处理,负责模型和模板的数据交互。
视图函数返回值类型:(1)以Json数据形式返回
前后端分离
JsonResponse
(2)以网页的返回
HttpResponse render redirect
路由匹配规则
url匹配正则注意事项:
正则匹配时从上到下进行遍历,匹配到就不会继续向后查找了
匹配的正则前方不需要加反斜线
正则前需要加(r)表示字符串不转义
url匹配规则:按照书写顺序,从上到下匹配,没有最优匹配的概念,匹配到就停止了。在最后面加 / 表示精确匹配。
eg:
# 127.0.0.1:8000/app/hehe/ ===>hehe
# 127.0.0.1:8000/app/hehehe/ ===>hehe
url(r'^hehe',views.hehe),
url(r'^hehehe', views.hehehe),
路由参数
如果路由路径是精确匹配,那么匹配到了就不管后面的是否准确。路由参数使用正则接收,必须在视图函数中接收,接收的数据类型都是字符串类型。
学习路由参数的目的是为了在请求路径和重定向中使用。
(1)基本使用
url(r'^testRoute/(\\d+)/', views.testRoute),
def testRoute(request, id):
print(id) # 8
print(type(id)) # str
return HttpResponse('testRoute')
http://114.215.129.166:8000/day05/testRoute/8/
(2)位置参数
使用圆括号包含规则,一个圆括号代表一个参数,代表视图函数上的一个参数,参数个数和视图函数上的参数一一对应(除默认request)
url(r'testLocation/(\\d{4})/(\\d+)/(\\d+)/', views.testLocation),
def testLocation(request, year, month, day):
print(year + '-' + month + '-' + day) # 2020-4-27
return HttpResponse('testLocation')
http://114.215.129.166:8000/day05/testLocation/2020/4/27/
(3)关键字参数
可以在圆括号指定参数名字(?P<name>reg),视图函数中存在和圆括号中name对应的参数,参数不区分顺序,个数也需要保持一致,一一对应。
url(r'^testKey/(?P<year>\\d{4})/(?P<month>\\d+)/(?P<day>\\d+)/', views.testKey),
def testKey(request, month, day, year):
print(year + '-' + month + '-' + day) # 2020-4-27
return HttpResponse('testKey')
http://114.215.129.166:8000/day05/testKey/2020/4/27/
21.2 内置函数
内置函数locals()
将局部变量,使用字典的形式打包,key是变量的名字,value是变量的值。
def testLocal(request):
name = 'lucy'
age = 18
return render(request, 'testLocal.html', context=locals())
testLocal.html
<body>
{{ name }}
{{ age }}
</body>
21.3 页面中的反向解析
21.3.1 反向解析的基本使用
1. 在根路由中设置namespace属性,一般和app名一致
url(r'day05/', include('Day05App.urls', namespace='day05')),
2. 在子路由中设置name属性,获取谁的路由,name属性就写在那个url中,一般和app名一致
url(r'^index/', views.index, name='index'),
3. 在视图函数中使用 reverse('namespace:name')
在模版中使用 {% url 'namespace:name' %}
作用:获取请求路径
在视图函数中使用
def testReverse(request):
a = reverse('day05:index')
print(a) # /day05/index/
return HttpResponse('测试反向解析')
在模版中使用
{# 点击a标签,然后跳转到index请求 #}
<a href="{% url 'day05:index' %}">测试页面中的反向解析</a>
21.3.2 反向解析的位置参数
{% url 'namespace:name' value1 value2 ... %}
views.py
def testUrl(request):
return render(request, 'testUrl.html')
def testReverseLocation(request, year, month, day):
print(year+'-'+month+'-'+day)
return HttpResponse('测试位置参数')
urls.py
url(r'^testUrl/', views.testUrl),
url(r'^testReverseLocation/(\\d{4})/(\\d+)/(\\d+)/', views.testReverseLocation, name='testReverseLocation'),
testUrl.html
<a href="{% url 'day05:testReverseLocation' 2020 4 28 %}">反向解析之位置参数</a>
访问http://114.215.129.166:8000/day05/testUrl/
21.3.3 反向解析的关键字参数
{% url 'namespace:name' key1=value1 key2=vaue2... %}
views.py
def testReverseKey(request, day, month, year):
print(year + '-' + month + '-' + day)
return HttpResponse('测试位置参数')
urls.py
url(r'^testReverseKey/(?P<year>\\d{4})/(?P<month>\\d+)/(?P<day>\\d+)/', views.testReverseKey, name='testReverseKey'),
testUrl.html
<a href="{% url 'day05:testReverseKey' year=2020 month=4 day=28 %}">反向解析之关键字参数</a>
访问http://114.215.129.166:8000/day05/testUrl/
21.3.4 优点
如果在视图,模板中使用硬编码连接,在url配置发生改变时,需要变更的代码会非常多,这样导致我们的代码结构不是很容易维护,使用反向解析可以提高我们代码的扩展性和可维护性。
21.4 视图函数中的反向解析
一般视图函数中的反向解析都会结合重定向一起使用
21.4.1 基本使用
reverse('namespace:name')
21.4.2 位置参数
reverse('namespace:name', args=(value1, value2 ...))
reverse('namespace:name', args=[value1, value2 ...])
urls.py
url(r'^testLocation/', views.testLocation),
url(r'^testReverseLocation/(\\d{4})/(\\d+)/(\\d+)/', views.testReverseLocation, name='testReverseLocation'),
views.py
def testLocation(request):
return redirect(reverse('res:testReverseLocation', args=[2020, 5, 1]))
def testReverseLocation(request, year, month, day):
return HttpResponse(year + '-' + month + '-' + day)
执行http://114.215.129.166:8000/res/testLocation/
21.4.3 关键字参数
reverse('namespace:name', kwargs={key1:value2, key2:value2 ...})
urls.py
url(r'^testKey/', views.testKey),
url(r'^testReverseKey/(?P<year>\\d{4})/(?P<month>\\d+)/(?P<day>\\d+)/', views.testReverseKey, name='testReverseKey'),
views.py
def testKey(request):
return redirect(reverse('res:testReverseKey', kwargs={'year': 2020, 'month': 5, 'day': 1}))
def testReverseKey(request, year, month, day):
return HttpResponse(year + '-' + month + '-' + day)
执行http://114.215.129.166:8000/res/testKey/
22 request对象
22.1 概念
django框架根据Http请求报文自动生成的一个对象,包含了请求的各种信息。
22.2 path
请求的完整路径
def testReq(request):
print(request.path) # /req/testReq/
return HttpResponse('testReq')
22.3 GET
获取get请求方式的参数
def testReq(request):
print(request.GET) # <QueryDict: {'name': ['zs', 'li'], 'age': ['18']}>
name = request.GET.get('name')
age = request.GET.get('age')
printDjango学习笔记(下)
[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段