2017-03-11 2 views
0

je les urls suivantes:Django - 2 URLS avec la même regex, mais différentes variables et vues

url(r'^(?P<college_name>\w+)/$', views.detail, name="detail"), 
url(r'^(?P<photographer_username>\w+)/$', views.photographer, name="photographer"), 

Il travaille quand je fais /college_name url, mais en tapant dans un photographe, comme website.com/johnsmith il cherche seulement premier motif d'URL, puis s'arrête.

Si je mets d'abord le modèle photographer, il fonctionne pour les photographes et non pour les collèges.

Comment puis-je résoudre le problème pour que cela fonctionne pour les deux?

+0

Comment voulez-vous que l'ordinateur détermine l'URL à laquelle vous voulez accéder? Cela ne peut pas être fait. –

Répondre

2

Vous devez différencier les deux modèles d'URL, sinon le dernier sera toujours masqué par le premier.

Peut-être PREPEND une chaîne unique à la fois:

url(r'^college/(?P<college_name>\w+)/$', views.detail, name="detail"), 
url(r'^photographer/(?P<photographer_username>\w+)/$', views.photographer, name="photographer"), 
2

Comment cela pourrait fonctionner? Comme vous le dites, l'expression régulière est la même. Alors, comment Django pouvait-il savoir quelle vue tu voulais dire? Il ne peut pas, alors il choisit juste le premier.

La seule façon de résoudre ce problème est de changer vos URL afin qu'ils ne sont pas seulement le nom: par exemple «/photographe// $ (P \ w +?) », Etc.

1

Comme d'autres ont dit, l'ordinateur ne peut pas déterminer quelle vue choisir de lui-même. La meilleure solution est d'avoir des chemins distincts comme /photographer/ et /college/.

Si vous insistez pour que les deux vues utilisent le même schéma d'URL, vous devez indiquer au programme comment différencier.

définition Url:

url(r'^(?P<photographer_or_college>\w+)/$', photographer_or_college_view, name="photographer_or_college") 

Voir qui capte un ou l'autre:

def photographer_or_college_view(request, photographer_or_college): 
    try: 
     photographer = Photographer.objects.get(photographer_name=photographer_or_college) 
    except Photographer.DoesNotExist: 
     pass 
    else: 
     return photographer_view(request, photographer) 

    college = get_object_or_404(College, college_name=photographer_or_college) 
    return college_view(request, college) 

Ce n'est pas recommandé puisque vous rencontrez des problèmes en cas de conflit de nom.