2016-11-14 11 views
1

私はシンプルなWebストアを構築しています。 CategoryのオブジェクトとProductのオブジェクトがあります。Djangoで同じURLパターンを再利用

は私がCategoryという名前の「ジャケット」http://example.com/jacketになりおよび「フー」という名前のProducthttp://example.com/fooになり、すなわち、両方のためのURLはトップレベルになりたいです。

URLでこれを処理する方法が同じ正規表現と一致するため、わかりません。私はちょうどDetailViewを持っていて、get_object()を上書きします。最初にスラッグのある製品をチェックしてから、スラッグでカテゴリをチェックし、最初に見つかったものを返します。 (製品とカテゴリーの両方が同じスラッグを持っている場合、私はその製品を提供したいと思っています)。

これを処理する良い方法はありますか?

答えて

0

これを処理するより良い唯一の方法は、URL内のオブジェクト(例:http://example.com/products/foohttp://example.com/categories/jacket)のベストプラクティスとネームスペースに従うことです。

ルートレベルのドメインにいるためにすべてが必要な場合(珍しいことですが、ルートレベルで新しいルートを追加するのが難しくなり、質問で言及したようにIDの衝突につながります)上記のようにURLを設定しておき、ルートレベルでr'^(?P<vanity>.+)/'をキャッチし、302を正しいURLにキャッチする第3のビューを作成してください。このような何か:

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を持っています。

関連する問題