Django路由参数传递

一、普通路由参数

在路由规则中以<参数数据类型:参数名称>的方式配置,有4种数据类型,如下表

参数数据类型

说明

str

任意非空字符串,不包含”/”,默认类型

int

0和正整数

slug

任何ASCII字符、连接符和下划线

uuid

以”-”连接的UUID格式字符串,所有字母必须小写

配置示例如下:

path("show_param_int/<int:param_int>", views.show_param_int),

path("show_param_str/<str:param_str>", views.show_param_str),

path("show_param_slug/<slug:param_slug>", views.show_param_slug),

path("show_param_uuid/<uuid:param_uuid>", views.show_param_uuid),

传递参数示例如下:

<a href="/my/show_param_int/11">传递int参数</a>

<a href="/my/show_param_str/一个字符串参数">传递str参数</a>

<a href="/my/show_param_slug/abcd_1234">传递slug参数</a>

<a href="/my/show_param_uuid/01234567-abcd-1234-5678-012345678912">传递uuid参数</a>

二、复杂路由re_path

re_path()方法中编写URL可以使用正则表达式,功能更加强大,路由中正则表达式的语法格式如下:

(?P<name>pattern)

其中name是匹配的字符串,pattern是要匹配的模式,具体示例如下:

re_path("show_re_path/(?P<year>\\d{4})&key=(?P<key>\\w+)", views.show_re_path),

传递参数示例如下:

<a href="/my/show_re_path/2024&key=abc">传递参数(re_path()方法正则匹配)</a>

三、反向解析路由

Django配置路由项的时候有一个name参数用来配置路由项的别名,示例如下:

path("", views.index, name="my_index"),

这个别名主要是为了方便在项目其他地方(视图函数或html模板)链接到该项对应的页面,别名在项目中应该是唯一的,推荐命名规则为”模块名_配置项名称”,比如上面配置的my_index表示这个是my模块的主页。视图函数中要得到my_index的路由可以用reverse('my_index'),html模板中要得到my_index的路由可以用{% url 'my_index' %}。

四、代码示例

1、定义路由

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

urlpatterns = [
    path("", views.index, name="my_index"),
    path("show_param_int/<int:param_int>", views.show_param_int),
    path("show_param_str/<str:param_str>", views.show_param_str),
    path("show_param_slug/<slug:param_slug>", views.show_param_slug),
    path("show_param_uuid/<uuid:param_uuid>", views.show_param_uuid),
    re_path("show_re_path/(?P<year>\\d{4})&key=(?P<key>\\w+)", views.show_re_path),
    path("show_url_reverse/", views.show_url_reverse, name="my_show_url_reverse"),
]

2、路由函数

from django.shortcuts import render, reverse
from django.http import HttpResponse


def index(request):
    return render(request, "my/index.html")
    # return HttpResponse("我的模块")


def show_param_int(request, param_int: int):
    # print(reverse('show_param_int'))
    context = {"param_int": param_int}
    return render(request, "my/show_param_int.html", context)


def show_param_str(request, param_str: str):
    context = {"param_str": param_str}
    return render(request, "my/show_param_str.html", context)


def show_param_slug(request, param_slug: int):
    context = {"param_slug": param_slug}
    return render(request, "my/show_param_slug.html", context)


def show_param_uuid(request, param_uuid: int):
    context = {"param_uuid": param_uuid}
    return render(request, "my/show_param_uuid.html", context)


def show_re_path(request, year: int, key: str):
    # print(reverse('show_re_path'))
    context = {"year": year, "key": key}
    return render(request, "my/show_re_path.html", context)


def show_url_reverse(request):
    print(reverse('my_show_url_reverse'))
    return render(request, "my/show_url_reverse.html")

3、视图模板

3.1、index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的模块</title>
</head>
<body>
    <h1>我的模块</h1>
    <ul>
        <li>
            <a href="/my/show_param_int/11">传递int参数</a>
        </li>
        <li>
            <a href="/my/show_param_str/一个字符串参数">传递str参数</a>
        </li>
        <li>
            <a href="/my/show_param_slug/abcd_1234">传递slug参数</a>
        </li>
        <li>
            <a href="/my/show_param_uuid/01234567-abcd-1234-5678-012345678912">传递uuid参数</a>
        </li>
        <li>
            <a href="/my/show_re_path/2024&key=abc">传递参数(re_path()方法正则匹配)</a>
        </li>
        <li>
            <a href="{% url 'my_show_url_reverse' %}">url反向解析</a>
        </li>
    </ul>
</body>
</html>

3.2、show_param_int.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的模块</title>
</head>
<body>
    <h1>传入的参数是:{{ param_int }}</h1>
    <br/>
    <a href="{% url 'my_index' %}">返回我的模块</a>
</body>
</html>

3.3、show_param_str.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的模块</title>
</head>
<body>
    <h1>传入的参数是:{{ param_str }}</h1>
    <br/>
    <a href="{% url 'my_index' %}">返回我的模块</a>
</body>
</html>

3.4、show_param_slug.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的模块</title>
</head>
<body>
    <h1>传入的参数是:{{ param_slug }}</h1>
    <br/>
    <a href="{% url 'my_index' %}">返回我的模块</a>
</body>
</html>

3.5、show_param_uuid.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的模块</title>
</head>
<body>
    <h1>传入的参数是:{{ param_uuid }}</h1>
    <br/>
    <a href="{% url 'my_index' %}">返回我的模块</a>
</body>
</html>

3.6、show_re_path.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的模块</title>
</head>
<body>
    <h1>传入的参数是(year:{{ year }},key:{{ key }})</h1>
    <br/>
    <a href="{% url 'my_index' %}">返回我的模块</a>
</body>
</html>

3.7、show_url_reverse.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的模块</title>
</head>
<body>
    <h1>my_show_url_reverse完整URL是:{% url 'my_show_url_reverse' %}</h1>
    <br/>
    <a href="{% url 'my_index' %}">返回我的模块</a>
</body>
</html>

五、多级路由

针对helloWorld项目我们有一个app(ch2),然后ch2下面还有一个子目录sub,我们先分别看一下三个层级的路由配置:

helloWord\urls.py如下:

ch2\urls.py如下:

ch2\sub\urls.py如下:

这里http://127.0.0.1:8000/为网站主页地址,在HTML模板中的链接方式如下:

<a href="{% url 'index' %}">主页</a>

http://127.0.0.1:8000/ch2/为app(ch2)的主页地址,在HTML模板中的链接方式如下:

<a href="{% url 'ch2:index' %}">ch2</a>

<a href="{% url 'ch2_:index' %}">ch2_namespace</a>

注意:主路由包含ch2路由的时候使用了namespace--path("ch2/", include("ch2.urls", namespace="ch2_"))

,所以可以用namespace的方式来替换ch2的app_name使用。

http://127.0.0.1:8000/ch2/sub/为app(ch2)下面子目录sub的主页地址,在HTML模板中的链接方式如下:

<a href="{% url 'ch2:ch2_sub:index' %}">ch2_sub</a>

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中,由(routing)是指将URL(统一资源定位符)映射到相应的视图函数或类的过程。Django使用URLconf(URL配置)来配置由。 URLconf是一个Python模块,它定义了URL模式和对应的处理函数或类。Django通过匹配URL模式来确定应该调用哪个处理函数或类来处理请求。下面是一些关于Django由的详细解释: 1. 根URLconf:每个Django项目都有一个根URLconf,它负责处理项目的根URL。这个根URLconf通常是项目目录中的urls.py文件,它定义了项目的顶级URL模式。 2. URL模式:URL模式是一个正则表达式(或字符串),用于匹配请求的URL。它可以包含变量和其他特殊字符来提取URL中的参数。URL模式在根URLconf和应用程序的URLconf中定义。 3. 处理函数或类:当URL模式与请求的URL匹配时,将调用相应的处理函数或类来处理请求。处理函数可以是常规的Python函数,也可以是基于类的视图。处理函数或类负责处理请求并返回响应。 4. 命名URL:Django允许为每个URL模式分配一个唯一的名称。这样可以使得在代码中引用URL更加方便和可维护。命名URL可以通过名称反向解析为对应的URL。 5. 包含(include):Django由系统支持将URL模式划分为不同的模块。可以使用include函数将其他URLconf包含到主URLconf中,实现由的分发和管理。 6. 参数传递:URL模式可以包含变量,这些变量可以从URL中提取出来,并作为参数传递给处理函数或类。这样可以实现动态的URL匹配和处理。 7. URL分发和重定向:Django允许将请求分发到不同的处理函数或类,并支持URL重定向。这样可以实现将请求从一个URL转发到另一个URL。 总的来说,Django由系统提供了灵活和强大的功能,可以帮助开发者管理项目中的URL,并将请求分发到适当的处理函数或类。通过定义URL模式和处理函数或类,可以实现对不同URL的定制化处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值