re_path转换:
需求:
实现一个获取文章列表的demo,用户可以根据/articles/文章分类/
的方式来获取文章。其中文章分类采用的是分类1+分类2+分类3...
的方式拼接的,并且如果只有一个分类,那就不需要加号。示例如下:
# 1. 第一种:获取python分类下的文章
/articles/python/
# 2. 第二种:获取python和django分类下的文章
/articles/python+django/
# 3. 第三种:获取python和django和flask分类下的文章
/articles/python+django+flask/
以此类推...
代码:## 标题
project:path_converter_demo
app : article
urls.py:
from django.urls import path,re_path
from . import views
urlpatterns = [
path(’’,views.article),
\w:0-9,a-z,A-Z \w+:表示一个或多个
#\w++\w+)+ 中间的“+”表示普通的加号
re_path(r’list/(?P\w+|(\w++\w+)+)/’,views.article_list)
]
views.py:
from django.shortcuts import reverse
from django.http import HttpResponse
def article(request):
return HttpResponse(“文章首页”)
def article_list(request,categories):
test = “图书的种类是:%s” % categories
return HttpResponse(test)
path转换## 标题
views.py
from django.shortcuts import reverse
from django.http import HttpResponse
def article(request):
return HttpResponse(“文章首页”)
def article_list(request,categories):
test = “图书的种类是:%s” % categories
return HttpResponse(test)
#这里使用了path的int转换
def article_detail(request,detail_id):
return HttpResponse(‘图书的ID是:%s’% detail_id)
urls.py:
from django.urls import path,re_path
from . import views
urlpatterns = [
path(’’,views.article),
re_path(r’list/(?P\w+|(\w++\w+)+)/’,views.article_list),
#使用int转换int:detail_id
path(‘detail/int:detail_id’,views.article_detail)
]
自定义路径转换器:
需求:
在“文章分类”参数传到视图函数之前要把这些分类分开来存储到列表中。
比如参数是python+django
,那么传到视图函数的时候就要变成['python','django']
。
以后在使用reverse反转的时候,限制传递“文章分类”的参数应该是一个列表,并且要将这个列表变成python+django
的形式。
project:path_converter_demo:
创建converter app:
为了能够调用这个转换器需要将它导入到__init__.py文件中:
init.py:
from . import converter
converter.py:
from django.urls import register_converter
class CategoriesConverter():
regex = r’\w+|(\w++\w+)+’
def to_python(self,values):
#/python+django/ 转换成列表
#['python','django']
result = values.split('+')
return result
def to_url(self,values):
if isinstance(values,list):
#将列表转换成/python+django/
result = "+".join(values)
return result
else:
raise RuntimeError("转换url的时候,分类参数必须为列表!")
#注册进转换器
register_converter(CategoriesConverter,‘cate’)
urls.py:
from django.urls import path,re_path
from . import views
urlpatterns = [
path(’’,views.article),
#re_path(r’list/(?P\w+|(\w++\w+)+)/’,views.article_list),
path(‘list/cate:categories/’,views.article_list,name=‘list’),
path(‘detail/int:detail_id/’,views.article_detail,name=‘detail’)
]
views.py:
from django.shortcuts import reverse
from django.http import HttpResponse
def article(request):
return HttpResponse(“文章首页”)
def article_list(request,categories):
print(categories)
print(reverse(‘list’,kwargs={‘categories’:categories}))
test = “图书的种类是:%s” % categories
return HttpResponse(test)
def article_detail(request,detail_id):
#reverse(‘detail’,kwargs={‘detail_id’:detail_id})
return HttpResponse('图书的ID是:%s'% detail_id)