1、创建项目和app应用
django-admin startproject djangourlname
python manage.py startapp urlname
2、在项目根目录下创建templates文件夹,并新建index.html文件。
3、注册app和配置templates模板文件搜索路径。
4、在urls.py文件中写入如下路由
from django.contrib import admin
from django.urls import path,re_path
from urlname import views
urlpatterns = [
path('admin/', admin.site.urls),
path('add/',views.add,name='add'),
path('index/',views.index),
]
细心地同学就会发现,与我们之前写的url路由不同,后面多了个name参数,那么path(‘add/’,views.add,name=‘add’),这里的name='add’是用来干什么的呢?
①其作用主要是通过name的值,来查找url地址,可以理解为反射的作用。简单说,name 相当于“给网址取了个名字”,只要这个名字不变,网址变了也能通过名字获取到。
②在html模板中使用name来反射url,优势是后期url规则发生改变之后,只需要调整urls.py即可,所有的模板文件都不需要修改。
5、在views.py中编写视图函数。
from django.shortcuts import render
from django.http import HttpResponse
def add(request):
return HttpResponse('你访问了第一个url路由')
def index(request):
return render(request,template_name='index.html')
6、修改index.html模板内容。引用我们之前定义的add/这个路由。
运行查看:
从上图我们可以看到a标签的href属性是我们之前定义的add/这个路由,点击它也是可以正常访问的。
7、现在我们对index.html稍作修改。改为下图所示:
刷新index查看:
发现它的href属性同样指向了我们之前定义的add/这个路由。这是怎么回事呢?请听我细细道来。
①这里就用到了我们之前在add/这个路由中写的那么参数。
②这个name参数就相当于对我们的URL进行命名,让我们能够在Django的任意处,尤其是模板内显式地引用它。
③这是一个非常强大的功能,相当于给URL取了个全局变量名,不会将url匹配地址写死。
现在解释下{% url ‘add’ %}这个标签的含义:
url是固定写法,表示当前要加载的url地址。'add’表示url路由对应的name参数值。 整体含义就是要加载name='add’的这个url地址。
使用name参数:
其好处就在于,当有许多模板都指向某个url时,我们可以很方便的指向它。当在后期需要更换地址时(前提是不改变name),就不会因为路由的修改影响整个地址的访问,不用造成大的页面改动。 同时,它的缺点就在于一旦name参数发生变化,就会造成整个页面的访问受到影响。
8、现在我们来证明这个问题。
①此时修改urls.py文件中的路由。如下图所示:
再次刷新访问:
发现整个页面的地址都同时变更,不用我们手动的对每一个a标签的href属性进行修改,对页面访问并无影响。
②现在我们将路由修改为原样,更改它的name参数:
再次刷新,发现直接报错。
经过上面的实验,证明了name参数对于整个地址的影响。同时应证了我们上面结论的正确性。
9、现在我们再对urls.py文件稍作修改,加入一条路由,如下图所示:
修改views.py文件,实现一个求和的逻辑。
同时修改index.html文件,如下图所示:
注意:
①不带参数的:{% url ‘name’ %}
②带参数的:参数可以是变量名 {% url ‘name’ 参数 %}
刷新查看:
此时,我们通过name这个参数,找到了re_path(r’^sum/(\d+)/(\d+)/$’,views.add1,name=‘add1’),这个路由,点击一个计算,同样会得到计算结果(可能有人就会说啦,4+5=9呀,哎,同学,你可走心啦,这是字符串相加。),其他两个就算就不一一打开看了。
10、当然我们也可以根据路由的name参数来反向获取url地址。
①在urls.py中新增一条get_url的路由。
②在views.py中编写业务逻辑。这里我们反向获取的是name="add1"的地址。
访问查看
当然也可以获取name="test"的地址,只不过在这是获取自身了。
这里用到了reserve()这个函数。reverse()这个函数就是根据url路由的name参数,来反向获取url地址的方法。