我可以让 Django 的 {% url %} 模板标签在作为参数传递时忽略 None 吗,从而使参数成为可选的?



我有一个带有列表的网站,我正在为它编写过滤器来分割列表。所以我可以:

/listings/furniture/
/listings/london/
/listings/free/

我也可以将这些链接在一起,例如:

/listings/free/furniture/
/listings/free/furniture/london/

当为这些过滤器构建链接时,如果过滤器设置为默认值(例如everywhereeverything),我想省略它

/listings/free/everything/everywhere/

我只想说:

/listings/free/

我有一个urls.py配置如下:

url(r'^listings/(?P<param1>[w-]+)/$', 'main.web.listings'),
url(r'^listings/(?P<param1>[w-]+)/(?P<param2>[w-]+)/$', 'main.web.listings'),
url(r'^listings/(?P<param1>[w-]+)/(?P<param2>[w-]+)/(?P<param3>[w-]+)/$', 'main.web.listings'),

当我为模板中的链接构建url时,我使用的代码如下:

{% url 'main.web.listings' "free" category_selected.slug location_selected.slug %}

这将使用当前选择的类别和位置进行链接,并将页面更改为仅显示"免费"项目。

因此,对于这个问题:在模板中,我有时可以有一个category_selected.slug,有时不可以,我希望{% url ... %}标记在参数设置为None时忽略它。然而,默认情况下,目前它返回的内容类似于:

/listings/free/None/None/

在这种情况下,我想返回:

/listings/free/

有没有办法解决这个问题,或者有更好的方法来解决我所缺少的问题?

{% url 'main.web.listings' param1="free" param2=category_selected.slug param3=location_selected.slug %}

我也陷入了类似的问题。我为我的案子找到了解决办法。我使用Django 2.2,所以我使用path()
urls.py

path('item/<int:item_id>/', views.show_item, name='show_item'),
path('item/<int:item_id>/<slug:slug>/', views.show_item, name='show_item'),

views.py

def show_item(request, item_id, slug=None):

show_item.html

<a href="{% url 'show_item' item_id=item.id %}{% if not item.slug is None %}{{ item.slug }}/{% endif %}">{{ item.name }}</a>

在你的情况下,答案可能是这样的:

<a href="{% url 'main.web.listings' "free" %}{% if not category_selected.slug is None %}{{ category_selected.slug }}/{% endif %}{% if not location_selected.slug is None %}{{ location_selected.slug }}/{% endif %}">Back to free item listings</a>

最新更新