文章目录
Django的MTV模式
控制器Controller urls.py views.py
模型Model models.py
视图View templates
Django模板
1.{{name}} -->变量相关
2.for循环
forloop.counter 当前循环索引值1开始
forloop.counter0 当前循环索引值0开始
forloop.recounter 当前循环倒序索引值1开始
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 当前循环的外层循环
{% for i in book_list %}
{{forloop.counter}}
{{forloop.last}}
{{i}}
{% empty %}
<li>没有数据执行这个</li>
{% endfor %}
3.if 判断
{% if a > b %}
...
{% elif a > c %}
...
{% else %}
...
{% endif %}
4.if ... in判断
{% if name in name_list %}
...
{% endif %}
filter 语法{{value|filter_name:参数}}
default如果变量没有传值使用nothing作为变量值
{{value|default:'nothing'}}
length 返回变量长度
{{value|length}}
filesizeformat
{{value|filesizeformat}}
如果value是123456789,输出117.7MB
slice 切片
{{value|slice “2:-1”}}
date 格式化
{{value|date “Y-m-d H:i:s“}}
safe
{{value|safe}}
导入自定义filter方法
#app下面新建包,包内新建app01_filter.py
from django import template
register = template.Library()
@register.filter(name="cut")
def cut(value, arg):
return value.replace(arg, "")
{# 先导入我们自定义filter那个文件 #}
{% load app01_filter %}
{# 使用我们自定义的filter #}
{{ somevariable|cut:"0" }}
中间变量with
{% with name = namelist1.1 %}
{{name}}
{% endwith %}
注释
{# 注释内容 #}
母版
1. 把公用的HTML部分提取出来,放到base.html文件中
2. 在base.html中,通过定义block,把每个页面不同的部分区分出来
3. 在具体的页面中,先继承母版
4. 然后block名去指定替换母版中相应的位置
使用母版和继承的注意事项:
1. {% extends 'base.html' %} --> 母版文件:base.html要加引号
2. {% extends 'base.html' %}必须放在子页面的第一行!!!
3. 可以在base.html中定义很多block,通常我们会额外定义page-css和page-js
母版
{% block page-main %}
{% endblock %}
继承
{% extends 'base.html' %}
{% block page-main %}
内容代码
{% endblock %}
注意继承页面中,写在block里面的代码才会执行,写在外面不执行
4. view.py相应的函数中返回的是对应的子页面文件 不是不是不是 base.html
组件
写好的一个模块代码,加载方法如下
{% include 'xxx.html'%}
自定义simple_tag,接受的参数个数大于2
app下新建文件夹,新建文件mysimpletag.py文件,文件名自定义
from django import template
register = template.Library()
@register.simple_tag(name="yimi")
def my_sum(arg1, arg2, arg3):
return "{} {} {}".format(arg1, arg2, arg3)
在HTML文件里面的使用
{% load mysimpletag %}
{% yimi 'wangzhen' 'tiancai' 'dafu' %}
自定义inclusion_tag,将HTML文件带上参数,插入到当前HTML文件中,和组件类似
app下新建文件夹,新建文件mysimpletag.py文件,文件名自定义
from django import template
register = template.Library()
@register.inclusion_tag('results.html')
def show_results(n):
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)]
return {"results": data}
HTML文件使用
{% load mysimpletag %}
{% show_results 10 %}
视图(接收请求返回响应那部分)
1. CBV(class base view)和FBV(function base view)
2. request对象
1. 之前学过的
1. request.method --> 获取请求的方法(GET、POST等)
2. request.GET --> 通常用来获取URL里面的参数
127.0.0.1:8000/edit_book/?id=1&name=yimi
request.GET --> {"id":1, "name":"yimi"}
request.GET.get("id")
3. request.POST --> 用来获取POST提交过来的数据
request.POST.get("book_name")
2. 补充其他常用的:
1. request.path_info --> 获取用户请求的路径(不包含IP和端口和URL参数)
2. request.body --> 请求体
3. response
基础必备三件套(求学要严谨)
1. HttpResponse --> 返回字符串内容
2. render --> 返回一个html页面
3. redirect --> 返回一个重定向(告诉浏览器再去访问另外的网址)
4. JsonResponse
data = {"name": "小黑", "age": 18}
data2 = [11, 22, 33, 44]
from django.http import JsonResponse
返回列表要加上safe=False
return JsonResponse(data2, safe=False)
路由系统(urls.py)
http://www.cnblogs.com/liwenzhou/p/8271147.html
1. 正则表达式的模糊匹配
2. 分组匹配 --> 相当于给视图函数传递位置参数
3. 分组命名匹配 --> 相当于给视图函数传递关键字参数
(两个不要混合使用)
反向解析URL
本质上就是给url匹配模式起别名,然后通过别名拿到具体的URL路径
-
怎么起别名?
在url匹配模式中,定义name=“别名”
url(r’^json99/$’, views.json_test, name=“json_test”), -
如何使用?
-
在模板语言里面使用:
{% url “别名” %} --> 得到具体的URL路径
点我 -
在视图中如何使用:
from django.urls import reverse
reverse(“别名”) --> 得到具体的URL路径redirect_url = reverse(“json_test”)
return redirect(redirect_url)
-
-
如何传参数?
1.路由系统
位置参数
url(r'^book/([0-9]{2,4})/([a-zA-Z]{2})/$', views.book, name="book"),
关键字参数
url(r'^book/(?P<year>[0-9]{2,4})/(?P<title>[a-zA-Z]{2})/$', views.book, name="book")
2. 视图传参数
传位置参数:
redirect_url = reverse("别名", args=(2018, "nb"))
return redirect(redirect_url)
传关键字参数:
redirect_url = reverse("别名" kwargs={"year": 2018, "title": "nb"})
return redirect(redirect_url)
3. 模板传参数:
{% url "别名" 2018 "nb" %}
{% url "别名" year=2018 title='nb' %}
链接传参数
<a href="{% url 'test' year=2018 title='nb' %}">测试</a>
视图接收参数
def test(request, year, title):
print("year:", year, type(year))
print("title:", title)
return HttpResponse("成功")
4. namespace
为了防止不同的app下面的url匹配模式有重复的别名
主路由
import app01,app02
url(r'^car/', include(('app01.urls','app01'), namespace="car"),),
url(r'^house/', include(('app02.urls','app02'), namespace="house")),
app01
url(r'^home/', views.home, name="home"),
app02
url(r'^home/', views.home, name="home"),
模板语言使用
<a href="{% url 'car:home' %}">买车主页,点我</a>
<a href="{% url 'house:home' %}">买房主页,点我</a>