2012-11-03 50 views
2

我有一个Django网站,它使用项目名称来创建适合浏览器的网址。例如:如何处理Django URL中的&符号?

/item/DeluxeWidget/ 

我有在名称中的符号的项目:

/item/Red & Blue Widget/ 

的符号抛出的事情了。如果我使用{{widget.name | fix_ampersands}},连字符将被转义为&,但它仍然没有在URL模式拿起:

url(r"^widget/(?P<name>[0-9a-zA-Z&,. -]+)/$", 'site.views.widget'), 

在我使用捕捉名字做视图

Widget.objects.get(name=name) 

在URL中处理&符号的转义,模式或过滤器的正确组合是什么?我也希望在其中使用带撇号的名字。我还有什么要处理这些吗?

+0

所以简短的回答是“不要”。无论如何,&符号都不属于URL。感谢您的建议 - SlugField似乎是我尝试做的理想工具。 –

回答

8

考虑使用SlugField能够自动填充有适合于在网址使用另一个字段的清理版本。

+0

是的 - 可能更简单的OP而不是改变URL结构+1 –

4

一般来说,你最好不这样做,并按照这么样的模式 - 让我们用这个页面为例(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)