我怎样才能创建一个像Stackoverflow一样工作的URL方案?
这个问题与this one不同,尽管它很相似。区别在于,我需要一个URL方案,它实现Stackoverflow的所有优点,并允许reverse
ing生成完全阻塞的URL。
具体来说,要模拟的Stackoverflow行为:
当错误的slug或没有给出slug时,转发到正确的slug。e、 g.如果我有一个名为My Object Name
的对象123
:
/123/ redirects to /123/my-object-name/
/123/something/ redirects to /123/my-object-name/
如果我将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/
,编辑对象名后,返回{我用了一个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模式。记住给两个模式不同的
name
。在现在,有趣的是:
/123/
发出请求时,它将匹配第一个url模式。在/123/my-object-name/
发出请求时,它将匹配第二个模式。在/123/some-wrong-slug/
,它也将匹配第二个模式。别担心,你会在你的视野里找到错误的鼻涕虫。在但这三个请求都将由一个视图处理。在
其次,在模型中定义一个名为
^{pr2}$slug
的property
。您将使用它来生成和访问对象的slug。在最后,处理请求的视图应该如下所示:
我希望这说明了如何实现类似于url行为的StackOverflow。在
相关问题 更多 >
编程相关推荐