美文网首页js css html
django中URL反向解析总结(url/reverse/get

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

作者: 菩提老鹰 | 来源:发表于2022-10-11 14:07 被阅读0次
django url 反向解析.png

前言介绍

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

相关文章

  • django中URL反向解析总结(url/reverse/get

    前言介绍 Django中进行URL反向解析一般有以下三种方式 在模板中使用 {% url 'blog:detail...

  • django

    from django.core.urlreolvers import reverse 反向解析url,具体用法可...

  • Django reverse函数

    reverse函数from django.urls import reversereverse 接收 url 中的...

  • URL 反向解析

    URL正向解析:有客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,调用相应的试...

  • FBV中的get_absolute_url方法

    在FBV(Funtional-Base View)中反向获取url的方式是重载get_absolute_url方法...

  • django的url反向解析

    在django项目开发中,最常见的一个需求是获得url的最终形式,以用于嵌入到生成的内容中或者是views中,或者...

  • django的url反向解析

    在django项目开发中,最常见的一个需求是获得url的最终形式,以用于嵌入到生成的内容中或者是views中,或者...

  • Django-4模板

    反向解析,根据规则生成url,所以namespace是可以用于解析. 自动生成url所以url改变也不用更改模板了...

  • Returning URLs - Django REST fra

    返回URL-Django REST框架 reverse.py 返回URL 将REST体系结构风格与其他基于网络的风...

  • django之url正/反向解析

    在include方法里面指定namespace却不提供app_name是不允许的。在包含的模块里设置app_nam...

网友评论

    本文标题:django中URL反向解析总结(url/reverse/get

    本文链接:https://www.haomeiwen.com/subject/egxzartx.html