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

3

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

例如,我想传递两个参数:my_colormy_year,但它们都是可选的,所以可能没有一个被传递,可能同时被传递,也可能只有一个被传递。

目前在urls.py中:

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

显然这不是正确的方法,只有在同时传递两个参数时才能使用。

那正确的解决方案是什么呢?

附注: 我已经找到了当只需要传递一个可选参数时的解决方法,但是还没有弄清如何处理多个参数。此外,“多路线选项”在这种情况下似乎不是解决方案(?)

1个回答

4
如果myyear是一串数字序列,而mycolor是一串非数字序列,你可以使用。
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/bla,它到底代表颜色还是年份?
话虽如此,我认为你把它想得太复杂了。你可以定义四种模式,例如:
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>):
    # …

如果两者具有相同的字符序列,则不可能,因为您如何解释products/bla?bla是颜色还是年份?这正是我不理解的。示例涉及2个参数,但如果我们需要传递10个可选参数呢? - Oto Shavadze
@OtoShavadze: 但你的参数是可选的,想象一下你既可以捕获颜色又可以捕获尺寸,那么你如何解释“/large”? “large”是一个颜色还是一个大小?从语义上讲,它当然是一个尺寸,但很难编写一个仅捕获颜色的正则表达式。可选部分会导致歧义。 - Willem Van Onsem
是的,你说得对,但是如何解决这种情况呢?也许只能通过标准方式传递参数 /?my_color=a&my_year=b 这是唯一的方法了吗? - Oto Shavadze
@OtoShavadze:我认为对于大量可选参数,这是首选的方式,因为这样可以清楚地知道参数是什么。此外,这更方便,因为Django将已经将其包装在类似于字典的对象中。 - Willem Van Onsem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接