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的主要内容,如果未能解决你的问题,请参考以下文章

将模板变量从 URL 传递到 Django 中的 FormPreview

Django在forms.py中使用视图或url中的变量

姜戈 |动态 URL 中的 JS 变量

django 整理一

比较 Django 模板中的 url

Django2.0中URL的路由机制