在 Django 中重用相同的 URL 模式
Posted
技术标签:
【中文标题】在 Django 中重用相同的 URL 模式【英文标题】:Reusing the same URL pattern in Django 【发布时间】:2017-03-28 17:38:55 【问题描述】:我正在建立一个简单的网上商店。有Category
对象和Product
对象。
我希望两者的 URL 都位于顶层,即名为“Jacket”的 Category
将位于 http://example.com/jacket,而名为“Foo”的 Product
将位于 http://example.com/foo。
我不确定如何在我的 URL 中处理这个问题,因为它们都匹配相同的正则表达式。我可以只拥有一个覆盖get_object()
的DetailView
,首先使用slug 检查产品,然后使用slug 检查类别并返回它首先找到的任何一个。 (如果产品和类别都有相同的 slug,我想为该产品提供服务。)
有没有更好的方法来处理这个问题?
【问题讨论】:
【参考方案1】:处理此问题的唯一更好方法是遵循最佳实践并在 url 中命名您的对象,即 http://example.com/products/foo 和 http://example.com/categories/jacket。
如果您绝对需要将所有内容都放在根级域中(这是一种不常见的需求,会使在根级添加任何新路由变得更加困难,并且正如您在问题中提到的那样让位于 ID 冲突)我建议仍然像我上面所做的那样设置您的 URL,并编写第三个视图,在根级别捕获 r'^(?P<vanity>.+)/'
并可能对正确的 URL 执行 302。像这样的:
class CatchAllView(View):
def get(self, request, *args, **kwargs):
vanity = kwargs.get('vanity')
if Products.objects.filter(pk=vanity):
return redirect('product', vanity=vanity)
elif Categories.objects.filter(pk=vanity):
return redirect('category', vanity=vanity)
else:
raise Http404("No such category or product.")
至少在发生冲突时,您实际上会有一个 URL 来访问每个产品和类别。
【讨论】:
以上是关于在 Django 中重用相同的 URL 模式的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 命名空间可重用应用程序中进行反向 URL 搜索