欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django从理论到实战 -url反转

程序员文章站 2022-05-08 10:25:37
学习笔记,仅供参考,有错必纠参考自:Django打造大型企业官网;本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的写一下。url反转之前我们都是通过url来访问视图函数,有时候我们知道这个视图函数,但是想反转回他的url,这时候就可以通过reverse来实现。例如,我们在front应用的urls.py中定义路由:from django.urls import pathfrom . import vi...

学习笔记,仅供参考,有错必纠

参考自:Django打造大型企业官网;

本系列Blog以应用为主,理论基础部分我在后端专栏Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的写一下。



url反转


之前我们都是通过url来访问视图函数,有时候我们知道这个视图函数,但是想反转回他的url,这时候就可以通过reverse来实现。

例如,我们在front应用的urls.py中定义路由:

from django.urls import path
from . import views


app_name = 'front'

urlpatterns = [
    path('', views.index),
    path('login/', views.login, name = "signin"),
]

在cms应用的urls.py中定义路由:

app_name = 'cms'

urlpatterns = [
    path('', views.index),
    path('login/', views.login, name = "signin"),
]

在front应用的views.py模块中定义一个视图函数:

def index(request):
    username = request.GET.get("username", "")
    if username:
        return HttpResponse("front首页")
    else:
        login_url = reverse('cms:signin')
        #利用url的name参数反转得到相应的url
        print("-+"*15)
        print(login_url)
        print("-+"*15)
        return redirect(login_url)

向http://127.0.0.1:8000/front/发起请求后,控制台的输出:

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/cms2/login/
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

如果这个url中需要传递参数,那么可以通过reverse函数中的kwargs来传递参数。

例如,我们在front应用的urls.py中定义路由:

from django.urls import path
from . import views

app_name = 'front'

urlpatterns = [
    path('show/<show_id>/', views.show, name = "show"),
    path('test/', views.test, name = "test"),
]

在views.py模块中我们定义一个视图函数test:

def show(request, show_id):
    return HttpResponse("ID为:{}".format(show_id))


def test(request):
    username = request.GET.get("username", "")
    if username: 
        return HttpResponse("测试页面")
    else:
        login_url = reverse('front:show', 
                            kwargs={"show_id":1})
        #利用url的name参数反转得到相应的url
        print("-+"*15)
        print(login_url)
        print("-+"*15)
        return redirect(login_url)

向http://127.0.0.1:8000/front/test/发起请求后,控制台的输出:

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/front/show/1/
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

同时,由于django中的reverse函数反转url时,不区分GET请求和POST请求,因此不能在反转的时候添加查询字符串的参数。

如果想要添加查询字符串的参数,只能手动的添加,例如:

login_url = reverse('login') + "?next=/"

本文地址:https://blog.csdn.net/m0_37422217/article/details/107103581