如何在Django中传递多个可选的URL参数?

问题描述

如何传递多个可选的URL参数?

例如,我想要传递2个参数:my_colormy_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_colormy_year,则它将为相应的元素传递一个空字符串。因此,您可以编写如下视图:

def some_view(request,my_color,my_year):
    if my_color:
        # …
    if my_year:
        # …

如果两个字符具有相同的字符序列,则不可能,因为您将如何解释products/blabla是颜色还是年份?

话虽这么说,我想你把它弄得太复杂了。您可以定义四种模式,例如:

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):
    # …