【发布时间】:2015-09-09 07:41:11
【问题描述】:
如何制作一个与 Stackoverflow 类似的 URL 方案?
这与this one 不是同一个问题,尽管它是相似的。不同之处在于我想要一个实现 Stackoverflow 的所有聪明才智的 URL 方案,并允许 reverseing 生成完全 slugged 的 URL。
具体来说,要模仿的 Stackoverflow 行为:
- 仅按 id 查找,slug 仅用于 SEO/可读性目的
-
在不正确的 slug 或没有给出 slug 时转发到更正的 slug。例如如果我有一个名称为
My Object Name的对象123:/123/ redirects to /123/my-object-name/ /123/something/ redirects to /123/my-object-name/ -
如果我将对象名称更改为
My New Object Name,则重定向目标 slug 会相应更改(这是 Stackoverflow 的行为,如果您编辑问题的标题),例如:/123/my-object-name/ redirects to /123/my-new-object-name/ - 反向工作,使
{% url 'my_view' 123 %}返回/123/my-object-name/,编辑对象名后返回/123/my-new-object-name/
我用models.py 破解了一些东西:
class MyModel(models.Model):
name = models.CharField(max_length=70)
def my_slugged_url(self):
slug = slugify(self.name)
if slug:
return reverse('my_view', args=[self.id]) + slug + "/"
return reverse('my_view', args=[self.id])
...和urls.py 模式:
url(r'^(\d+)/\S+/$', 'my_view')
url(r'^(\d+)/$', 'my_view'),
...还有一个views.py:
def my_view(request, id):
obj = get_object_or_404(MyModel, pk=id)
if request.path != obj.my_slugged_url():
return redirect(obj.my_slugged_url())
...但这感觉不对,这意味着当我执行reverse 或{% url 'my_view' 123 %} 时,它会返回一个类似/123/ 的URL,然后必须重定向到/123/my-object-name。
我怎样才能像 Stackoverflow 一样进行这项工作?
【问题讨论】:
-
也许给这两种模式不同的名字?
-
问题是,带有 slug 的模式 (
url(r'^(\d+)/\S+/$', 'my_view')) 怎么知道要返回什么 slug? -
@awidgery 这个问题可能会有所帮助 - Django optional URL patterns。
标签: python django django-urls