2016-11-14 67 views
1

我正在構建一個簡單的Web商店。有Category對象和Product對象。在Django中重複使用相同的URL模式

我想兩個網址是在頂層,即Category名爲「外套」將在http://example.com/jacket和名爲「foo」 Product將在http://example.com/foo

我不知道如何處理這個在我的網址,因爲兩個匹配相同的正則表達式。我可以只有一個DetailView,它會覆蓋get_object(),首先檢查帶有slu product的產品,然後用slu checking檢查一個類別並返回找到的第一個類別。 (如果產品和cateogry具有相同的slu,,我想爲該產品服務。)

有沒有更好的方法來處理這個問題?

回答

0

處理此問題的唯一更好的方法是遵循最佳做法並在url中命名空間對象,即http://example.com/products/foohttp://example.com/categories/jacket

如果你絕對需要一切都在根級別域(這是一個不常見的需求,使得在根級別添加任何新路由更加困難,並讓位於ID衝突,就像你在問題中提到的那樣),我會建議仍然按照上面的方法設置您的網址,然後編寫第三個視圖,在根級別捕獲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.") 

至少這樣你實際上有一個網址去每一個產品和類別的事件有一個碰撞。

相關問題