Django菜鸟实例教程:路由分组和路由转发器

2024-04-1108:53:38后端程序开发Comments536 views字数 2395阅读模式

文章列表模板

复制zdpdjango_basic,然后在templates中新建一个articles.html文件,用来展示文章列表:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>文章列表:</h1>
<ul>
    {% for article in articles %}
        <li>{{ article.title }}</li>
    {% empty %}
        <li>暂无数据</li>
    {% endfor %}
</ul>
</body>
</html>

创建视图函数

在index/views.py中,创建一个articles_view的视图函数:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

from django.shortcuts import render


def article_view(request):
    articles = [
        {"id": i + 1, "title": f"文章标题{i + 1}"}
        for i in range(10)
    ]
    return render(request, "article.html", {"articles": articles})

修改路由

接着,修改index/urls.py,定义文章列表的路由:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

from django.urls import path
from . import views

urlpatterns = [
    path("articles/2024/4/", views.article_view),
]

此时,浏览器访问:http://localhost:8000/articles/2024/4/文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

使用正则路由分组

在实际的使用中,我们的年份和月份通常是根据实际的日期动态传递过来的,所以我们这里不能写死。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

改写index/urls.py如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

from django.urls import path, re_path
from . import views

urlpatterns = [
    re_path("articles/(\d{4})/(\d{1,2})", views.article_view),
]

当捕获到数据以后,还需要在视图函数里面手动声明并接收。修改index/views.py如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

from django.shortcuts import render


def article_view(request, year, month):
    articles = [
        {"id": i + 1, "title": f"文章标题{i + 1}", "date": f"{year}-{month}"}
        for i in range(10)
    ]
    return render(request, "article.html", {"articles": articles})

相应的,模板也稍加修改,将date字段渲染出来:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>文章列表:</h1>
<ul>
    {% for article in articles %}
        <li>{{ article.title }}  {{ article.date }}</li>
    {% empty %}
        <li>暂无数据</li>
    {% endfor %}
</ul>
</body>
</html>

具名分组

有名分组时按照关键字传参的,普通的正则分组则是使用位置传参。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

我们可以将正则的分组取名。修改index/urls.py如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

from django.urls import path, re_path
from . import views

urlpatterns = [
    re_path("articles/(?P<year>\d{4})/(?P<month>\d{1,2})", views.article_view),
]

路由转发器

正则表达式越来越复杂的时候,urls.py里面就会有很多看上去很臃肿的代码。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

为了解决这个问题,Django给我们提供了路由转发器。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html

from django.urls import path, re_path
from . import views
from django.urls import register_converter


class YearConverter(object):
    """年份的路由转发器"""
    regex = r"\d{4}"

    def to_python(self, value):
        return int(value)


class MonthConverter(object):
    """月份的路由转发器"""
    regex = r"\d{1,2}"

    def to_python(self, value):
        return int(value)


register_converter(YearConverter, "year")
register_converter(MonthConverter, "month")

urlpatterns = [
    path("articles/<year:year>/<month:month>/", views.article_view),
]
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/62936.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/62936.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定