Django进阶学习,模板、filter、母版、块、组件、视图、路由

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路径

  1. 怎么起别名?
    在url匹配模式中,定义name=“别名”
    url(r’^json99/$’, views.json_test, name=“json_test”),

  2. 如何使用?

    1. 在模板语言里面使用:
      {% url “别名” %} --> 得到具体的URL路径
      点我

    2. 在视图中如何使用:
      from django.urls import reverse
      reverse(“别名”) --> 得到具体的URL路径

      redirect_url = reverse(“json_test”)
      return redirect(redirect_url)

  3. 如何传参数?

	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>
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值