Django从理论到实战(part14)--url反转

    技术2023-05-15  68

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

    参考自: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=/"
    Processed: 0.018, SQL: 9