【问题标题】:How Do I Handle Ampersands in Django URLs?如何处理 Django URL 中的 & 符号?
【发布时间】: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 似乎是我正在尝试做的理想工具。

标签: python django url django-urls


【解决方案1】:

考虑使用SlugField,它可以自动填充另一个适合在 URL 中使用的字段的清理版本。

【讨论】:

  • 是的 - 对于 OP 来说可能更简单,而不是更改 URL 结构 +1
【解决方案2】:

一般来说,您最好不要这样做,并遵循 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)

【讨论】:

    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2010-12-02
    相关资源
    最近更新 更多