我有一个带有两个可选关键字参数的视图:team 和year_month
def monthly_data_list(request, year_month:str=None, team=None):
从模板中,我想使用这两个参数之一或两者来调用不同的组合。
Django 文档给出了实现此示例:
path('monthly/list/', views.monthly_data_list, {'team':None, 'year_month'=None },name='monthly-data-list'),
但是,使用一个或两个参数从模板调用此 URL 会出现 NoReverseMatch 错误:
hx-get="{% url 'drivers:monthly-data-list' team=None year_month=current_year_month %}"
我找到了here建议的解决方法,即定义所有参数组合的路径。这适用于 2 个参数,但更多参数会变得复杂。
如何正确实现多个可选参数?
您误解了文档。如果你写一个路径:
path(
'monthly/list/',
views.monthly_data_list,
{'team': None, 'year_month': None},
name='monthly-data-list',
),
该路径将不会采用任何参数,无论是否可选。该路径将接受
/monthly/list/
作为路径,并将为 None
和 team
填充 year_month
。
如果您的视图可以通过多个模式提供服务,则通常会传递这些参数,例如:
urlpatterns = [
path(
'monthly/list/',
views.monthly_data_list,
{'team': None, 'year_month': None},
name='monthly-data-list',
),
path(
'monthly/list/<str:team>/',
views.monthly_data_list,
{'year_month': None},
name='monthly-data-list',
),
path(
'monthly/list/<str:team>/<str:year_month>/',
views.monthly_data_list,
name='monthly-data-list',
),
]
所以现在我们有三个模式,其中一个没有任何
team
或year_month
,然后我们使用None
代替,一个带有/<str:team>/
,在这种情况下,我们将填写None
作为`year_month,最后是一个可以指定两者的地方。
在这种情况下,我们可以通过提及必要的参数来进行相反的操作,例如他的情况:
{% url 'monthly-data-list' team='Foo' %}
然后,这将选择第二条路径,并为
'Foo'
填写 team
,并且它将用 monthly_data_list
为 None
调用 year_month
。