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

时间:2014-01-17 09:48:32

标签: python django django-templates

我有一个包含商家信息的网站,我正在编写用于细分商家信息的过滤器。 所以我可以:

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

我也可以把它们连在一起,例如:

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

在为这些过滤器构建链接时,如果将过滤器设置为默认值(例如{。{1}}或everywhere,我想省略过滤器。所以不要说例如:

everything

我想说:

/listings/free/everything/everywhere/

我的/listings/free/ 配置如下:

urls.py

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

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'),

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

所以,对于这个问题:在模板中,我有时会有category_selected.slug,有时候没有,我希望{% url 'main.web.listings' "free" category_selected.slug location_selected.slug %} 标记在设置为{% url ... %}时忽略参数。但是,默认情况下,它返回的内容如下:

None

在这种情况下,我希望返回:

/listings/free/None/None/

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我也坚持与此类似。我为我的案件找到了解决方案。我正在使用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>