【Django03】URL_name

#test_cal\urls.py

from django.contrib import admin
from django.urls import path
from app_cal import views as cal_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('add/',cal_views.add,name = 'add'),
    path('add/<int:a>/<int:b>',cal_views.add2,name = 'add2')
]

#name 可以用于在 templates, models, views ……中得到对应的网址,相当于“给网址取了个名字”,只要这个名字不变,网址变了也能通过名字获取到。
#修改app_cal\views.py
#添加代码如下

def index(request):
    return render(request,'home.html')

将app_cal添加至test_cal\settings.py文件中INSTALLED_APPS项

这样,使用render的时候,Django 会自动找到 INSTALLED_APPS 中列出的各个 app 下的 templates 中的文件。

,DEBUG=True 的时候,Django 还可以自动找到 各 app 下 static 文件夹中的静态文件(js,css,图片等资源),方便开发。
在这里插入图片描述

#在app_cal中新建一个temolates文件夹,并在templates中新建一个home.html
<!DOCTYPE html>

<html>

<head>
<title>three little pigs</title>

</head>

<body>
<a href = 'https://github.com/'>世界最大同性恋交友网站</a>
<br>
<a href = '/add/4/5'>计算4+5</a>
</body>

</html>

#修改test_cal\urls.py文件
urlpatterns = [
    path('',cal_views.index,name = 'home'),
    path('admin/', admin.site.urls),
    path('add/',cal_views.add,name = 'add'),
    path('add/<int:a>/<int:b>',cal_views.add2,name = 'add2'),
]

在这里插入图片描述
我们计算加法的时候用的是 /add/4/5/ ,后来需求发生变化,比如改成 /4_add_5/,但在网页中,代码中很多地方都写死的 /add/4/5/,比如模板中可能是这么写的

<a href="/add/4/5/">计算 4+5</a>

如果这样写“死网址”,会使得在改了网址(正则)后,模板(template),视图(views.py,比如用于URL跳转),模型(models.py,获取记录访问地址等)用了此网址的,都必须进行相应的更改,修改的代价很大,一不小心,有的地方没改过来,就不能用了。

通过shell获取对应网址

reverse 接收 url 中的 name 作为第一个参数,我们在代码中就可以通过 reverse() 来获取对应的网址(这个网址可以用来跳转,也可以用来计算相关页面的地址),只要对应的 url 的name不改,就不用改代码中的网址。
在这里插入图片描述
在网页模板中也可以使用:

不带参数的:
{% url ‘name’ %}

带参数的:参数可以是变量名
{% url ‘name’ 参数 %}

例如:
<a href="{% url ‘add2’ 4 5 %}">link</a>

代码渲染最终页面是:

<a href="/add/4/5/">link</a>

这样当urls.py进行更改时,只要name参数不修改,所获取的网址也会动态地跟着变,当urls.py中关于add2的代码修改成:

path(‘new_add/int:a/int:b’,cal_views.add2,name = ‘add2’),

用在 views.pymodels.py 等地方的 reverse函数,同样会根据 name 对应的url获取到新的网址。想要改网址的时候,修改 urls.py 中的正则表达式部分(url 参数第一部分),name 不变的前提下,其它地方都不需要修改。

在这里插入图片描述

# 如何将老的URL跳转至新的网址?

#views.py
from django.urls import reverse
from django.http import HttpResponseRedirect

def old_add2_redirect(request,a,b):
    return HttpResponseRedirect(
    reverse('add2',args = (a,b))
    )

#urls.py
    path('new_add/<int:a>/<int:b>',cal_views.add2,name = 'add2'),
    path('add/<int:a>/<int:b>',cal_views.old_add2_redirect),

猜你喜欢

转载自blog.csdn.net/cs_xuhuan/article/details/82875436
今日推荐