我有一个Django站点,它使用项目名称来创建查看器友好的URL。例如:
/item/DeluxeWidget/
我有一个名称中带有&符号的项目:
/item/Red & Blue Widget/
&符号抛出了一些东西。如果我使用{{widget.name | fix_ampersands}},&符号将被转义为&
,但仍未在网址格式中获取:
url(r"^widget/(?P<name>[0-9a-zA-Z&,. -]+)/$", 'site.views.widget' ),
在视图中,我使用捕获的名称来执行
Widget.objects.get(name=name)
在URL中处理&符的转义,模式或过滤器的正确组合是什么?我也期望在其中遇到带撇号的名字。我有什么办法可以处理这些吗?
答案 0 :(得分:8)
考虑使用SlugField,它可以自动填充适用于网址的其他字段的清理版本。
答案 1 :(得分:4)
一般来说,你最好不要这样做,并遵循一种SO模式 - 让我们使用这个页面作为例子(http://stackoverflow.com/questions/13212960/how-do-i-handle-ampersands-in-django-urls
)
然后你可以这样做:
url(r"^widget/(?P<widget_id>[0-9]+)/(?P<widget_name>(.*?)/$", 'site.views.widget' ),
然后:
{{ widget.name|fix_ampersands }}
变为{{ widget.name|slugify }}
Widget.objects.get(name=name)
变为Widget.objects.get(pk=widget_id)