如何处理 Django URL 中的 & 符号?
Posted
技术标签:
【中文标题】如何处理 Django URL 中的 & 符号?【英文标题】:How Do I Handle Ampersands in Django URLs? 【发布时间】:2012-10-24 03:48:24 【问题描述】:我有一个 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 中的 & 符号?我也希望遇到带有撇号的名字。我也应该做些什么来处理这些问题吗?
【问题讨论】:
所以简短的回答是“不要”。无论如何,& 符号并不真正属于 URL。感谢您的建议 - SlugField 似乎是我正在尝试做的理想工具。 【参考方案1】:考虑使用SlugField,它可以自动填充另一个适合在 URL 中使用的字段的清理版本。
【讨论】:
是的 - 对于 OP 来说可能更简单,而不是更改 URL 结构 +1【参考方案2】:一般来说,您最好不要这样做,并遵循 SO 类型的模式 - 让我们以此页面为例 (http://***.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)
【讨论】:
以上是关于如何处理 Django URL 中的 & 符号?的主要内容,如果未能解决你的问题,请参考以下文章
django-rest-framework 如何处理多个 URL 参数?