django中URL反向解析总结(url/reverse/get_absolute_url)

在这里插入图片描述

前言介绍

Django中进行URL反向解析一般有以下三种方式

  • 在模板中使用 {% url 'blog:detail' post.id %}的方法
  • 在view视图中一般使用reverse() 函数
  • 还有一种特殊情况下使用 get_absolute_url的方法

上面三种方式都可以帮助替代硬编码简化程序维护成本

模板中使用url 标签

用法很简单,同时也是支持多个参数,比如博客中常用到的

# 无参数,访问博客首页
{% url 'blog:index' %}

# 一个参数,访问指定ID的博客详情页
{% url 'blog:detail' post.id %}

上面中的blog:index格式中

  • blog 是在APP下的url.py中定义的app_name ,一般配合项目urls.py 路径中的namespace 使用
# project/urls.py
urlpatterns = [
    ... ...,
	path('blog/', include('blog.urls', namespace='blog')),
]

# blog/urls.py
app_name = 'blog'
urlpatterns = [
    ... ...,
	path('', views.index, name='index'),
    path('post/<int:id>/', views.detail, name='detail'),
]

  • detail 是具体URL path的别名

比如上述代码中的 name='index'name='detail',这样做的好处就是如果URL path 路径发生了变化,那么也不用去template模板中修改对应的URL地址,因为name 没有变

view视图中使用reverse函数

reverse的目的和template使用url标签是一样的,只是用的位置不一样而已(url标签在template模板,而reverse在view 视图代码中)

  • 使用URL 别名
>>> from django.urls import reverse
>>> reverse('blog:home')
'/blog/'
>>> reverse('blog:archive')
'/blog/archive/'
  • 使用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
>>> from django.urls import resolve
>>> reverse('blog:detail', args=(2, ))
'/blog/post/2/'
>>> reverse('blog:detail', kwargs={'id': 2})
'/blog/post/2/'

参考https://docs.djangoproject.com/en/4.1/ref/urlresolvers/#django.urls.reverse

get_absolute_url定义和使用

先说get_absolute_url的定义,是在对应的Model下,比如Post文章Model

class Post(models.Model):
	... ...
    def get_absolute_url(self):
        from django.urls import reverse
        return reverse('blog:detail', args=(self.id, ))

其实这里也看到它其实借用了 reverse来实现,那么问什么要单独定义这么个函数呢?

原因在于

1、在VIew视图中如果使用redirect进行跳转的话,使用直接使用对象,方便很多

from django.shortctus import redirect

def comment(request, post_id):
    post = Post.objects.get(id=post_id)
    # comment 逻辑,评论成功则返回到对应的文章详情页
    return redirect(post)

2、在template模板中可以使用 {{ post.get_absolute_url }} 来代替 {% url 'blog:detail' post.id %}

3、扩展: 后续如果学习了 django restframework 之后,在使用viewset的时候,详情页的返回也是默认调用 get_absolute_url

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DjangoURL解析是将URL映射到特定的视图函数或类的过程。URL解析器检查传入的URL并根据定义的规则将其映射到视图函数或类。这使得Django能够根据不同的URL调用不同的视图函数或类。 DjangoURL解析定义方法如下: 1. 在应用程序创建urls.py文件:在应用程序的根目录创建一个名为urls.py的文件。 2. 导入视图函数或类:在urls.py文件导入视图函数或类,以便URL可以映射到它们。 3. 定义URL模式:使用Django内置的URL模式来定义URL模式。例如,以下是一个简单的URL模式: ``` from django.urls import path from . import views urlpatterns = [ path('hello/', views.hello, name='hello'), ] ``` 在这个例子,我们定义了一个URL模式,将/hello/映射到名为“hello”的视图函数。 4. 匹配URL:当Django收到一个请求时,它会使用URL解析器来匹配请求的URLURL解析器会查找与请求URL匹配的URL模式,并调用与该模式相关联的视图函数或类。 5. 使用URL名称:可以为URL模式命名,并在代码使用该名称来引用URL。这使得URL模式的更改更容易,并且可以在代码重复使用。 ``` from django.urls import path from . import views urlpatterns = [ path('hello/', views.hello, name='hello'), path('goodbye/', views.goodbye, name='goodbye'), ] ``` 在这个例子,我们定义了两个URL模式,并将它们命名为“hello”和“goodbye”。现在,可以在代码使用这些名称来引用这些URL模式,例如: ``` from django.urls import reverse url = reverse('hello') ``` 这些是DjangoURL解析的基本定义方法。通过使用URL解析器,可以轻松地将URL映射到视图函数或类,并在Web应用程序实现复杂的URL路由。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值