2016-11-14 2 views
1

Ich baue einen einfachen Web-Shop. Es gibt Category Objekte und Product Objekte.Wiederverwendung der gleichen URL-Muster in Django

Ich möchte, dass die URLs sowohl für auf der obersten Ebene sein, dh ein Category namens „Jacket“ bei http://example.com/jacket wäre und ein Product namens „Foo“ auf http://example.com/foo wäre.

Ich bin nicht sicher, wie dies in meinen URLs zu behandeln, da beide den gleichen regulären Ausdruck entsprechen. Ich kann nur eine einzige DetailView haben, die get_object() überschreibt, zuerst nach einem Produkt mit dem Slug sucht und dann nach einer Kategorie mit dem Slug sucht und zurückgebe, was auch immer es zuerst findet. (Im Falle, dass sowohl ein Produkt als auch eine Kategorie den gleichen Slug haben, würde ich das Produkt servieren wollen.)

Gibt es einen besseren Weg, damit umzugehen?

Antwort

0

Der einzige bessere Weg, dies zu handhaben, ist Best Practice und Namespace Ihre Objekte in der URL, d. H. http://example.com/products/foo und http://example.com/categories/jacket.

Wenn Sie unbedingt alles auf der Stammebene Domäne (was eine ungewöhnliche Notwendigkeit ist, macht Hinzufügen neuer Routen auf der Stammebene schwieriger, und gibt ID Kollision, wie Sie in Ihrer Frage erwähnen) würde ich schlagen Sie vor, Ihre URLs wie oben beschrieben einzurichten und eine dritte Ansicht zu schreiben, die r'^(?P<vanity>.+)/' auf der Stammebene abfängt und möglicherweise eine 302 zur richtigen URL macht. Etwas wie folgt aus:

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.") 

Wenigstens auf diese Weise Sie haben tatsächlich eine URL für jedes Produkt und Kategorie für den Fall zu bekommen gibt es eine Kollision.

Verwandte Themen