Django URL 变量 - URL 中的企业名称而不是 ID
Posted
技术标签:
【中文标题】Django URL 变量 - URL 中的企业名称而不是 ID【英文标题】:Django URL Variables - Business Name in URL in stead of ID 【发布时间】:2014-04-09 23:32:38 【问题描述】:尝试在 URL 中传递企业名称而不是 ID。当我传递 ID 时,一切都很好。
urls.py
url(r'^(?P<name>\w+)/$', 'views.business'),
views.py
def business(request, name=1):
return render_to_response('business.html',
'business': business.objects.get(name=name) )
template.html
<a href="http://website.com/ business.name|slugify /">Name business.name </a>
当我这样做时,它只适用于单个单词的公司名称,例如“银行”,但是如果该公司有多个单词“富国银行”,它将不起作用。
我的目标是使用 slugify 传递简短的 SEO 友好 URL,例如
http://website.com/business-name/
感谢您的宝贵时间和帮助!
【问题讨论】:
“不会工作”是什么意思?如果是Wells Fargo
,你会得到什么?
找不到页面 (404) 请求方法:GET 请求 URL:127.0.0.1:8000/Wells%20Fargo
使用带有连字符的 slugify 链接时相同 找不到页面 (404) 请求方法:GET 请求 URL:127.0.0.1:8000/Wells-Fargo
感谢您更详细地描述问题 - 它有帮助。
【参考方案1】:
根据re module docs\w:
匹配任何字母数字字符和下划线
并且您尝试匹配的 url 有一个破折号,因为 django 的 slugify 方法将空格和一些非 ascii 字符转换为破折号。所以修复包括将 urls.py 模式修改为:
url(r'^(?P<name>[\w-]+)/$', 'views.business'),
但这还不够。您当前的视图将尝试获取具有 slugified 名称的 Business 实例,并将引发 DoesNotExists 异常。所以你应该做以下事情之一:
向您的业务模型添加一个 slug 字段,其值必须为 slugify(business.name)
或在 url 中添加一个 id,如下所示:
url(r'^(?P[\w-]+)/(?P\d+)/$', 'views.business'),
并修改视图以通过 id 获取实例:
def business(request, name, obj_id):
return render_to_response('business.html', 'business': business.objects.get(id=obj_id) )
【讨论】:
同上。查询错误:我猜查询无法将名称与其中的连字符匹配。 DoesNotExist at /wells-fargo/ 业务匹配查询不存在。请求方法:GET 请求 URL:127.0.0.1:8000/wells-fargo Django 版本:1.5.4 异常类型:DoesNotExist 异常值:业务匹配查询不存在。感谢您的帮助! 对,我编辑了我的答案来解决这个问题。希望对您有所帮助。 感谢您的帮助!一些很棒的想法,尽管我暂时采用了上述方法,但我计划将 slugify(business-name) 添加到模型中,以便我们可以更好地控制 URL 值。再次感谢!【参考方案2】:首先,你需要在你的 url 配置中允许破折号:
url(r'^(?P<name>[-\w]+)/$', 'views.business'),
[-\w]+
在任何情况下都匹配“字母数字”字符、下划线 (_) 和破折号。
另外,在视图中,你需要将传入的值“unslugify”:
def business(request, name='unknown'):
name = name.replace('-', ' ').capitalize()
return render_to_response('business.html',
'business': business.objects.get(name=name) )
另见:
My Django URLs not picking up dashes docs on slugify How do I create a slug in Django?希望对您有所帮助。
【讨论】:
查询错误:我猜查询不能匹配名称和其中的连字符。 DoesNotExist at /wells-fargo/ 业务匹配查询不存在。请求方法:GET 请求 URL:127.0.0.1:8000/wells-fargo Django 版本:1.5.4 异常类型:DoesNotExist 异常值:业务匹配查询不存在。 也许视图应该有某种 replace('-', ' ') 函数来从 URL 中删除连字符以匹配 DB 中的名称? 非常感谢您的帮助!它工作得很好。再次感谢!以上是关于Django URL 变量 - URL 中的企业名称而不是 ID的主要内容,如果未能解决你的问题,请参考以下文章