问题描述
如何传递多个可选的URL参数?
例如,我想要传递2个参数:my_color
和my_year
,但是它们是可选的,因此可能不会传递任何参数,可能两者都传递,也可能只有一个。
目前在urls.py
,我有:
urlpatterns = [
re_path(r'^products/(?P<my_color>.*)/(?P<my_year>.*)$',some_view),]
这显然是不正确的,只有在两个都通过的情况下才能起作用。
什么是正确的解决方案?
P.S。 当只需要传递一个可选参数时,我找到了答案,但没有弄清楚如何对几个参数执行相同的操作。同样,在这种情况下,“多路由选项”似乎不是解决方案(?)
解决方法
如果myyear
是个数字的序列,而mycolor
是个非数字的序列,则可以使用
urlpatterns = [
re_path(r'^products/((?P<my_color>\D+)/)?(?P<my_year>\d+)$',some_view),]
如果不存在my_color
或my_year
,则它将为相应的元素传递一个空字符串。因此,您可以编写如下视图:
def some_view(request,my_color,my_year):
if my_color:
# …
if my_year:
# …
如果两个字符具有相同的字符序列,则不可能,因为您将如何解释products/bla
? bla
是颜色还是年份?
话虽这么说,我想你把它弄得太复杂了。您可以定义四种模式,例如:
urlpatterns = [
path(r'^products/',path(r'^products/<int:year>/'),path(r'^products/<str:color>/'),path(r'^products/<str:color>/<int:year>/',]
因此,您在此处为同一视图定义了四个视图。然后,该视图可以定义可选参数:
def some_view(request,color=None,year=None):
# …