2017-03-11 5 views
0

Ich habe folgenden Webadressen:Django - 2 URLS mit dem gleichen regulären Ausdruck, aber verschiedene Variablen und Ansichten

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

Es funktioniert, wenn ich /college_name url tun, aber wenn in einem Fotografen wie website.com/johnsmith eingeben es sucht nur die erstes URL-Muster und stoppt dann.

Wenn ich das photographer Urlmuster zuerst einsetze, funktioniert es für Fotografen und nicht für Hochschulen.

Wie kann ich es reparieren, so dass es für beide funktioniert?

+0

Wie soll der Computer herausfinden, auf welche URL Sie zugreifen möchten? Dies kann nicht getan werden. –

Antwort

2

Sie sollten die zwei URL-Muster unterscheiden, andernfalls wird das spätere immer durch das erstere beschattet.

prepend Vielleicht eine eindeutige Zeichenfolge an beide:

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

Wie könnte dies möglicherweise überhaupt funktionieren? Wie Sie sagen, ist die Regex die gleiche. Wie konnte Django also wissen, welche Ansicht du meintest? Es kann nicht, also wählt es nur das erste aus.

Der einzige Weg, dies zu beheben, ist Ihre URLs zu ändern, so dass sie den Namen nicht nur haben: zB „/ Fotograf// $ (P \ w +?)“ Usw.

1

Wie andere haben Der Computer kann nicht herausfinden, welche Ansicht er selbst auswählen soll. Die beste Lösung ist, verschiedene Pfade wie /photographer/ und /college/ zu haben.

Wenn Sie darauf bestehen, dass beide Ansichten dasselbe URL-Schema verwenden, müssen Sie dem Programm mitteilen, wie es zu unterscheiden ist.

URL Definition:

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

Ansicht, die eine oder die andere greift:

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) 

Dies wird nicht empfohlen, da Sie in Probleme laufen wird, wenn es einen Namenskonflikt ist.

Verwandte Themen