URL的设计与配置

Django URL传递参数的方法path和_re_path

介绍

Django URL提供了两种匹配方式传递参数: path和re_path。

path是正常参数传递,

re_path是采用正则表达式regex匹配。

path方法:采用双尖括号<变量类型:变量名>或<变量名>传递,例如<int:id>, <slug:slug>或<username>。

re_path方法: 采用命名组(?P<变量名>表达式)的方式传递参数。

 案例

下图两种传递文章id给视图函数的方式是一样的。re_path里引号前面的小写r表示引号里为正则表达式, 请忽略'\'不要转义,^代表开头,$代表以结尾,\d+代表正整数。

# blog/urls.py
from django.urls import path, re_path

from . import views

urlpatterns = [
    path('blog/article/<int:id>/', views.article, name = 'article'),
   re_path(r'^blog/article/(?P<id>\d+)/$', views.article, name='article'),
]

# View (in blog/views.py)

def article(request, id):
    # 展示某篇文章

 URL的命名及reverse()方法

你注意到没?我们在上述代码中还给URL取了一个名字 'article'。这个名字大有用处,相当于给URL取了个全局变量的名字。它可以让你能够在Django的任意处,尤其是模板内显式地引用它。假设你需要在模板中通过链接指向一篇具体文章,下面那种方式更好?

方法1: 使用命名URL
<a href="{% url 'article' id %}">Article</a>

方法2: 使用常规URL - 不建议
<a href="blog/article/id">Article</a>

如果你还没意识到方法1的好处,那么想想吧,假设你需要把全部模板链接由blog/article/id改为blog/articles/id, 那种方法更快?改所有模板,还是改URL配置里的一个字母?

可惜的是命名的URL一般只在模板里使用,不能直接在视图里使用。如果我们有了命名的URL,我们如何把它转化成常规的URL在视图里使用呢?Django提供的reverse()方法很容易实现这点。假设不同的app(比如news和blog)里都有article这个命名URL, 我们怎么区分呢? 我们只需要在article前面加上blog这个命名空间即可。

from django.urls import reverse

# output blog/article/id
reverse('blog:article', args=[id])

URL如何指向基于类的视图(View)

目前path和re_path都只能指向视图view里的一个函数或方法,而不能指向一个基于类的视图(Class based view)。

Django提供了一个额外as_view()方法,可以将一个类伪装成方法。

这点在当你使用Django在带的view类或自定义的类时候非常重要。具体使用方式如下:

# blog/urls.py
from django.urls import path, re_path

from . import views

urlpatterns = [
      path('', views.ArticleList.as_view(), name='article_list'),
    path('blog/article/<int:id>/', views.article, name = 'article'),
    re_path(r'^blog/article/(?P<id>\d+)/$', views.article, name='article'),
]

# View (in blog/views.py)
from django.views.generic import ListView
from .views import Article

class ArticleList(ListView):

    queryset = Article.objects.filter(date__lte=timezone.now()).order_by('date')[:5]
    context_object_name = 'latest_article_list'
   template_name = 'blog/article_list.html'

def article(request, id):
    # 展示某篇文章

通过URL方法传递额外的参数

在你配置URL时,你还可以通过字典的形式传递额外的参数给视图, 而不用把这个参数写在链接里。如下面案例所示:

# blog/urls.py
from django.urls import path, re_path

from . import views

urlpatterns = [

    path('', views.ArticleList.as_view(), name='article_list', {'blog_id': 3}),
    re_path(r'^blog/article/(?P<id>\d+)/$', views.article, name='article'),
]

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值