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

How to pass multi optional URL parameters in django?

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

例如,我想传递 2 个参数:my_colormy_year,但它们是可选的,因此可能会传递其中的 none,可能两者都传递,或者可能只有一个。

目前在 urls.py 我有 :

urlpatterns = [
    re_path(r'^products/(?P<my_color>.*)/(?P<my_year>.*)$', some_view),
]

这显然是不正确的,只有在两个都通过时才有效。

什么是正确的解决方案?

P.S。 当只需要传递一个可选参数时,我找到了答案,但不知道如何为少数参数做同样的事情。此外,在这种情况下,“多路由选项”似乎不是解决方案 (?)

如果myyear位的序列,而mycolornon-digits[=34的序列=],你可以使用

urlpatterns = [
    re_path(r'^products/((?P<my_color><b>\D+</b>)/)?(?P<my_year><b>\d+</b>)$', 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/', some_view),
    path(r'^products/<<b>int:</b>year>/'),
    path(r'^products/<<b>str:</b>color>/'),
    path(r'^products/<<b>str:</b>color>/<<b>int:</b>year>/', some_view),
]

因此,您在这里为同一视图定义了四个视图。然后视图可以定义可选参数:

def some_view(request, color<b>=None</b>, year<b>=None</b>):
    # …