这篇文章来讲一下django中的路由url规则和模板templates中模板的渲染和常用的标签语法,以及django后台的管理
参数的传递
我们知道在模板中我们知道变量使用了双括号{{var}}
这里的变量是从view中传来的参数,然如何实现在url中传递自己想要的参数呢?
- 在django2.0以前的版本中使用的是
url(r'^test/(+d)$')
来进行传参的, - 在2.0之后采用
path
和re_path
进行从url传入可变参数
使用非正则从url传参
例如:path("test/<str:id>", views.test)
要从URL捕获值,使用的是尖括号,例如<str:id>
捕获的就是字符串
默认情况下,以下路径转换器可用:
str
- 匹配除路径分隔符之外的任何非空字符串'/'
。如果转换器未包含在表达式中,则这是默认值。int
- 匹配正整数,包含0。slug
- 匹配字母、数字以及横杠、下划线组成的字符串。uuid
- 匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。path
- 匹配任何非空字符串,包含了路径分隔符
当然对于一些复杂或者复用的需要,可以定义自己的转化器。
使用正则从url传参
当然你还是喜欢正则的化依然可以使用re_path
通过正则来进行传参
- 在Python正则表达式中,命名式分组语法为
(?P<name>pattern)
,其中name为名称, pattern为待匹配的模式。
例如:
re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[^/]+)/', views.article_detail),
- url是按照列表的书写顺序进行匹配的
- 从上到下匹配,没有最有匹配的概念
- 直接指定以
^
开头 - 在结尾处直接添加反斜线
只要正则学好了就很容易,这种方法虽然比上面那种复杂一点,单却好用的多,适合所有场景。
在view中获取路由url数据的几种方法
- 传过来的GET形式参数可以使用
request.GET.get('stu')
进行获取 - 传过来的POST形式参数可以使用
request.POST.get('stu')
进行获取 - 多个参数可以使用
request.POST.getlist('stu')
获取一个列表 - 获取请求方法:
request.method
- 获取请求路径:
request.path
- 获取请求参数的字典:
request.GET.dict()
Querydict => dict
常用几个函数
- locals
内置函数
将局部变量,使用字典的方式进行打包
key是变量名,value是变量中的存储的数据
一般用于render的第三个参数
django后台管理
首先创建一个用户
python manage.py createsuperuser
然后分别输入账户,邮箱和密码
接着我们来到我们app的admin.py进行注册我们之前创建的模型
使用admin.site.register(Students)
进行注册
然后重启服务器后输入路径/admin
即可进入后台,即可看到对应的类生成的管理界面
并可以对我们创造的模型里的数据进行修改操作。
上面的Students object
其实就是模型对象去str
当然我们可以在模型里面重写__str__
魔术方法来修改
class Students(models.Model):
s_stu = models.CharField(max_length=16)
s_score = models.IntegerField()
objects = StudentsManager()
def __str__(self):
return self.s_stu
接着我们重启服务器即可看到学生的姓名而不是Students object
- 控制后台页面管理的内容
我们可以创建一个类继承admin.ModelAdmin
类,然后再下面注册的时候写上我们自定义的模型管理类
class StudentAdmin(admin.ModelAdmin):
list_display = ['s_stu', 's_score']
admin.site.register(Students, StudentAdmin)
list_display 就是控制后台页面要显示那些内容
模板的渲染
模板的渲染有两种方法,但本质是一样的
- 先通过
loader
加载,然后使用render
渲染
这样做的好处是:可以加载⼀次模板,然后进⾏多次渲染
例如:
from django.template import loader #导⼊loader
def index(request):
temp = loader.get_template('index.html')
res = temp.render(context={'content':'hello index'})
res2 = temp.render(context={'content':'hello world'})
return HttpResponse(res)
# return HttpResponse(res2)
2.直接使用render,也是最长用的一种方式:
例如:
from django.shortcuts import render
def index(request):
context={'content':'hello world'}
return HttpResponse(request, 'index.html', locals())
templates常用标签
- 过滤器模板语法:
{{ 变量名 | 过滤器:可选参数 }}
注释
单行注释
{# 被注释的内容 #}
多行注释
{% comment %}
被注释的内容
{% endcomment %}
遍历字典
- forloop.counter: 顺序获取循环序号,从 1 开始计算
- forloop.counter0: 顺序获取循环序号,从 0 开始计算
- forloop.revcounter: 倒叙获取循环序号,结尾序号为 1
- forloop.revcounter0: 倒叙获取循环序号,结尾序号为 0
- forloop.first(一般配合if标签使用): 第一条数据返回 True,其他数据返回 False
- forloop.last(一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False
模板继承
在父模板使用 block...endblock预留区域,相当于挖一个坑
{% block 名称 %}
预留给子模板的区域,可以设置设置默认内容
{% endblock 名称 %}
然后再子模板中继承父模板,再将内容写到block...endblock里填坑:
{% extends "父模板路径"%}
{ % block 名称 % }
内容
{% endblock 名称 %}
模板包含
使用
{% include "模板路径"%}
即可包含其他模板文件
也可以使用include+entends
- 三个标签可以混合使用
- 能用block + entends搞定的,就尽量不要使用include
- 如果我们继承自一个父模板,子模板自己直接重写页面的结构是不生效的,只能再既有的坑中进行填充
html转义
- 如果想让传过来的内容不想被转义可添加
safe
过滤器,即{{ stu|safe }}
- 也可以使用下面方法
{% autoescape off %}
这里的内容将会被渲染不被转义
{% endautoescape %}
{% autoescape on %}
这里的内容将不会被渲染因为被转义
{% endautoescape %}
自定义过滤器
如果上述的过滤器还满足不了你,你就可以自己来定义过滤器了
- 首先在app内创建一个目录名为templatetags(必须是这个名字)
- 然后再包下创建一个py文件:
from django import template
register = template.Library() # 加载模板库
@register.filter(name='hello') # 注册一个过滤器 name代表在模板中使用过滤器的名字
def add3(value):
return str(int(value) + 3)
然后再html中加载你的这个加载自定义过滤器的模块就可以使用你写好的模块了:
{% load mytags %}
<h1>
{{ num|hello }}
</h1>
这里我写的过滤器是将url中传来的数字加3,当我们输入/one/index/6
的时候就会再页面返回9