django中URL反向解析总结(url/reverse/get_absolute_url)
前言介绍
Django中进行URL反向解析一般有以下三种方式
- 在模板中使用
{% url 'blog:detail' post.id %}
的方法 - 在view视图中一般使用
reverse()
函数 - 还有一种特殊情况下使用
get_absolute_url
的方法
上面三种方式都可以帮助替代硬编码
简化程序维护成本
模板中使用url 标签
用法很简单,同时也是支持多个参数,比如博客中常用到的
1 | # 无参数,访问博客首页 |
上面中的blog:index
格式中
- blog 是在APP下的url.py中定义的
app_name
,一般配合项目urls.py 路径中的namespace 使用
1 | # project/urls.py |
- detail 是具体URL path的别名
比如上述代码中的 name='index'
和 name='detail'
,这样做的好处就是如果URL path 路径发生了变化,那么也不用去template模板中修改对应的URL地址,因为name 没有变
view视图中使用reverse函数
reverse的目的和template使用url标签是一样的,只是用的位置不一样而已(url标签在template模板,而reverse在view 视图代码中)
- 使用URL 别名
1 | from django.urls import reverse |
- 使用view函数名
官网教程提示可以使用 view视图函数名 (reverse(views.home)
)来解析,但是实际测试是报错 django.urls.exceptions.NoReverseMatch: Reverse for 'blog.views.home' not found. 'blog.views.home' is not a valid view function or pattern name.
- 如果带参数的话,可以使用 args 和 kwargs
1 | from django.urls import resolve |
参考https://docs.djangoproject.com/en/4.1/ref/urlresolvers/#django.urls.reverse
get_absolute_url定义和使用
先说get_absolute_url
的定义,是在对应的Model下,比如Post文章Model
1 | class Post(models.Model): |
其实这里也看到它其实借用了 reverse
来实现,那么问什么要单独定义这么个函数呢?
原因在于
1、在VIew视图中如果使用redirect
进行跳转的话,使用直接使用对象
,方便很多
1 | from django.shortctus import redirect |
2、在template模板中可以使用 {{ post.get_absolute_url }}
来代替 {% url 'blog:detail' post.id %}
3、扩展: 后续如果学习了 django restframework 之后,在使用viewset的时候,详情页的返回也是默认调用 get_absolute_url
的
django中URL反向解析总结(url/reverse/get_absolute_url)
http://blog.colinspace.com/2022/10/11/django中URL反向解析总结-url-reverse-get-absolute-url/