Django
中的url
与视图详解(3)可能你学习到这里,感觉好乱,所将的知识点没有一丝的关联,这个是没有办法的,Django
与Flask
有所不同的,Django
是结构化的,每个模块都有知识点,我们只有先了解、学会了才能在后面的项目中游刃有余,坚持,话不多说,请看见天的操作。
如果在反转url
的时候,需要添加参数,那么可以传递kwargs
参数到revers
函数中。示例代码如下:
detail_url = reverse('detail',kwargs={"article_id":1,'page':2})
如果想要添加查询字符串的参数,则必须手动的进行拼接。示例代码如下:
login_url = reverse('login') + "?next=/"
在前面如果认真看的话,我粗略的讲过URL转换器的参数,包括int、uuid
等,现在我们来盘它了。
有时候内置的URL转换器不能实现我们的需求,因此,Django
很人性化的给我们一个接口让我们自己定义URL转换器。
自定义url
转换器按照以下五个步骤来走就可以了:
regex
,这个属性是用来限制URL转换器规则的正则表达式。to_python(self,value)
方法,这个方法是将URL中的值转换一下,然后传给视图函数的。to_url(self,value)
方法,这个方法是在做URL反转的时候,将传进来的参数转换后拼接成一个正确的URL。 5. 将定义好的转换器,使用django.urls.converters.register_converter
方法注册到Django
中。示例代码如下:
from django.urls import register_converter
class CategoryConverter(object):
regex = r'\w+|(\w+\+\w+)+'
def to_python(self,value):
# python+django+flask
# ['python','django','flask']
result = value.split("+")
return result
def to_url(self,value):
# value:['python','django','flask']
# python+django+flask
if isinstance(value,list):
result = "+".join(value)
return result
else:
raise RuntimeError("转换url的时候,分类参数必须为列表!")
register_converter(CategoryConverter,'cate')
使用path或者是re_path的后,在route中都可以包含参数,而有时候想指定默认的参数,这时候可以通过以下方式来完成。
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.page),
path('blog/page<int:num>/', views.page),
]
# View (in blog/views.py)
def page(request, num=1):
pass
...
解释:
当在访问blog/
的时候,因为没有传递num
参数,所以会匹配到第一个URL,这时候就执行view.page
这个视图函数,而在page函数中,又有num=1
这个默认参数。因此这时候就可以不用传递参数。而如果访问blog/1
的时候,因为在传递参数的时候传递了num
,因此会匹配到第二个URL,这时候也会执行views.page
,然后把传递进来的参数传给page函数中的num
。
鸡汤:学习不是三分钟的热血,而是一辈子所为之努力的,加油吧,骚年!