1、Django路由
基本格式:
path(“字符串”,要执行任务的视图)
re_path(“正则表达式”,要执行任务的视图)
正则回顾:
字符 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结尾位置。 |
. | 匹配除换行符 \n 之外的任何单字符 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\w | 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 |
\W | 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。 |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
| | 指明两项之间的一个选择 |
() | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用 |
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次 |
? | 匹配前面的子表达式零次或一次 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
# urls.py
from django.contrib import admin
from django.urls import path, re_path
from project1.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('laowang/', hello),
re_path(r'laowang/(?P<id>\w+)', re), # 若是指定了名称,视图必须使用指定的名称才能获取数据,没有指定视图则可随意指定名字获取
re_path(r'b/(\d{4})/(\d{2}|\d{1})/(\d{2}|\d{1})', re_day), # 分组匹配获取
]
# views.py
from django.shortcuts import HttpResponse, render
def hello(request):
return HttpResponse("hello")
def re(request, id): # 获取指定名称的数据
return HttpResponse(id)
def re_day(request, year, month, day):
return HttpResponse(f"{year},{month},{day}")
2、Django模板
2.1 模板的使用
1、settings中的BASE_DIR是项目的根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
2、创建templates目录
3、修改settings中templates的路径
# views.py
def index(request):
name = "老王"
return render(request, "index.html", locals())
from project1.views import index
# urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path("index/", index),
]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<hr>
{{ name }}
</body>
</html>
2.2 模板语法
Django的模板语法和flask类似
# views.py
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def show(self):
return self.name
def show2(self, info):
return info
def index(request):
"""首页"""
name = "老王"
age = 18
hobby = ["敲门", "洗脚", "烫头发"]
address = {"province": "广东省", "city": "广州市"}
person = Person("老王", 33)
person_list = [
]
person_list2 = [
{"id": 1234, "name": "老王1", "age": 33},
{"id": 12, "name": "老王2", "age": 33},
{"id": 333, "name": "老王3", "age": 33},
{"id": 5555, "name": "老王4", "age": 33},
{"id": 5, "name": "老王5", "age": 33}
]
msg = "<h1 style='color:red'>我是隔壁的老王</h1>"
msg2 = "i AM chinese"
return render(request, "index.html", locals())
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<hr>
{{ name }} {#变量的使用#}
<hr>
{{ hobby.1 }} {#列表数据的获取,根据索引获取,不能用[0]的方式获取#}
<hr>
{{ address.city }} {#字典数据的获取,不能用["city"]的形式获取#}
<hr>
{{ person.name }} {#对象数据的获取#}
<hr>
{{ person.show }} {#对象方法的调用#}
<hr>
{# if判断 #}
{% if age >= 18 %}
成年了
{% elif age < 18 %}
未成年
{% endif %}
<hr>
{# 判断是否相等 #}
{% ifequal age 18 %}
我18岁了
{% endifequal %}
<hr>
{# 循环的特殊变量,forloop #}
{% for i in hobby %}
{% if forloop.first %}
<p>第一次循环</p>
{% endif %}
<p>{{ forloop.counter }},{{ forloop.counter0 }},{{ i }}</p>
{% if forloop.last %}
<p>最后一次循环</p>
{% endif %}
{% endfor %}
<hr>
{% for person in person_list %}
{{ person }}
{% empty %} {# 判断是否为空 #}
没有数据
{% endfor %}
<hr>
{% autoescape on %} {# 是否执行源代码 #}
{{ msg }}
{% endautoescape %}
<hr>
{% autoescape off %}
{{ msg }}
{% endautoescape %}
<hr>
{{ msg|safe }} {# safe过滤器 #}
<hr>
{{ msg2 | upper }} {# lower等过滤器 #}
<hr>
{% for person in person_list %}
{% if forloop.counter|divisibleby:2 %} {# 是否整除2 #}
<tr>
{% else %}
<tr style="background-color: red; color: white">
{% endif %}
<td>{{ forloop.counter }}</td>
<td>{{ person.name }}</td>
<td>{{ person.age }}</td>
</tr>
{% empty %}
没有数据
{% endfor %}
</body>
</html>
3、过滤器
过滤器是对数据进行过滤处理的方法。
1、创建templatetags包
名字是固定的,不能随意改动
2、 在templatetags包里创建文件,用来存放过滤器函数,文件名字可以任意。
3、编写过滤器函数
from django.template import Library
register = Library() # 实例化模板库
@register.filter # 用来注册过过滤器的装饰器
def phone_filter(phone):
"""接收并返回过滤的结果函数"""
result = phone[:3]+"***"+phone[-4:] # 对号码进行处理
return result # 返回过滤结果
4、使用过滤器
{% load buyer_filter %} <!-- 加载过滤器 -->
<p class="text-center">{% phone|phone_filter %}</p> <!-- 使用phone_filter过滤器 -->
4、静态文件
1、 在项目目录下创建静态文件目录
2、修改配置信息
3、加载静态文件
静态文件的加载有两种方式
方式1:
<img src="/static/img/user.jpg">
方式2:
{% load static %}
<img src="{% static '/img/user.jpg' %}">
方式2是加载设置里面的STATIC_URL,根据STATIC_URL拼接静态文件地址。
5、模板的加载和继承
模板的加载和继承和flask一样
5.1 加载
{% include "a.html" %}
5.2 继承
{% extends "a.html" %}
5.3 修改个性部分
<!--a.html-->
{% block label %}
<h1>神奇宝贝</h1>
{% endblock %}
<!--子模板-->
{% extends "a.html" %} <!-- 基础1.html的公共部分 -->
{% block label %} <!-- 修改个性部分,若子模板不修改,则继承父模板内容 -->
<h1>皮卡丘</h1>
{% endblock %}