2017-01-19 1 views
0

(Django v 1.10.4) J'essaie d'utiliser deux applications distinctes dont le préfixe d'URL est la racine du site maintenir la structure url existante). Les deux applications/modèles en question sont "artistbio/Bio" et "pages/BasicPage". À l'heure actuelle, j'ai les modèles d'URL dans la configuration principale url (à l'origine, ils étaient dans leurs propres fichiers url.py respectifs, mais la question que j'ai est le même dans les deux cas):Django Indentical Modèle d'URL dans deux applications distinctes Conflit

from django.conf.urls import include, url 
from django.contrib import admin 
from django.conf import settings 
from artistbio.views import BioDetail 
from pages.views import PageDetail 


urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^(?P<slug>[\w\-]+)/', PageDetail.as_view()), 
    url(r'^(?P<slug>[-\w]+)/', BioDetail.as_view(), name='bio-detail'), 

Tout ce que j'ai lu (et tous les mon expérience à ce jour) a montré que Django essayera de faire correspondre la requête à chaque modèle d'URL avant de donner une erreur "ne correspond à aucun modèle d'URL" ou une erreur "404 introuvable" si l'objet demandé n'existe pas. Mais maintenant quand les deux patterns sont ensemble comme indiqué ci-dessus, quand je demande un objet Bio via BioDetail, il essaie de faire correspondre le modèle d'URL pour PageDetail et me donne une erreur 404 (ce qui est logique) mais ça veut aussi dire que Django ne bouge jamais sur le modèle d'URL suivant où il serait certainement un match. Si je les change, et que je place le motif BioDetail au-dessus du motif PageDetail, comme je l'avais prévu, j'ai alors accès aux objets Bio mais pas aux objets Page.

J'ai lu toutes les entrées StackOverflow que j'ai pu trouver, j'ai lu tous les documents officiels et référencé Django Unleashed, mais la solution me semble toujours manquer!

Répondre

2

De Django documentation:

Lorsqu'un utilisateur demande une page de votre site propulsée par Django, c'est l'algorithme du système suit pour déterminer quel code Python pour exécuter:

  1. Django détermine la le module URLconf racine à utiliser. Généralement, il s'agit de la valeur du paramètre ROOT_URLCONF, mais si l'objet HttpRequest entrant a un attribut urlconf (défini par middleware), sa valeur sera utilisée à la place du paramètre ROOT_URLCONF.
  2. Django charge ce module Python et recherche les variables d'URL. Cela devrait être une liste Python de django.conf.urls.url() instances.
  3. Django parcourt chaque modèle d'URL, dans l'ordre, et s'arrête au premier qui correspond à l'URL demandée.
  4. Une fois que l'une des expressions régulières correspond, Django importe et appelle la vue donnée, qui est une simple fonction Python (ou une vue basée sur la classe). [...]

Mise au point sur le point 3: Django arrêter pour traiter la variable urlpatterns dès qu'un regexp valider l'URL actuelle. Il appelle la vue et si ces vues renvoient un 404, l'erreur est renvoyée au client.

Django ne continuera pas à correspondre à l'URL avec des motifs suivants si une vue d'un retour 404.

Donc, en gros, pour résoudre votre problème, vous devrez écrire une vue qui correspondent à l'URL, analyser la limace et essayez d'obtenir le Page correspondant ou Bio (dans cet ordre). Mais je vous suggère de planifier une migration vers un système où Pages et Bio ont leur propre point de vue pour afficher du contenu.

+0

Merci pour votre réponse Antwane. Donc, je prends cela pour signifier que ce que j'essaie de faire est tout simplement impossible? Sinon, je vais simplement combiner les deux modèles en un et passer à autre chose. – brandondavid

+0

Oui, c'est impossible à moins de développer une vue spéciale pour gérer ce cas particulier (voir la fin de la réponse) – Antwane

+0

Vous devriez avoir des schémas d'URL distincts pour les artistes et les pages de toute façon - sinon un jour ou l'autre vous aurez une page et l'artiste avec des limaces similaires et l'un suivra l'autre (ou vous aurez besoin d'une "page de désambiguïsation" à là wikipedia, ce qui est un peu un kludge). FWIW ayant tous les urls d'artistes préfixés avec "/ artist /" rend le sens parfait à mon humble avis, même d'un point de vue SEO. –