Django Cross-Site-Reverse-URLs

8

Wahrscheinlich einfache Frage und ich verpasse gerade etwas, aber ich stecke aus Ideen heraus.

Ich habe ein Django-Projekt, das mehrere Sites mit unterschiedlichen sessions.py und völlig verschiedenen ROOT_URLCONF s bedient. Eine Website behandelt die Benutzerregistrierung, die Authentifizierung und die Profileinstellungen, eine andere Site (in einer anderen Domäne) fungiert als Dateimanager und so weiter. Websites teilen dieselbe DB, Medien und Vorlagen. Alle Websites teilen sich die gleiche Benutzerdatenbank und implementieren eine Art transparenten Single-Sign-On- / Single-Sign-Off-Mechanismus. Es ist wie eine große Site, die sich über mehrere Domains erstreckt.

Das Problem ist, dass ich viele {% url %} -Tags in meinen Templates habe und sie nicht funktionieren, wenn Templates auf anderen Sites verwendet werden. Und ich möchte vermeiden, URLs so hart wie möglich zu codieren.

Zum Beispiel habe ich auf der Site A (a.example.org) ein

%Vor%

Eintrag in A's URLconf. Dann habe ich in global_menu.html template {% url list_users %} und offensichtlich funktioniert es perfekt, was zu " /users/ " führt.

Nun, es gibt Seite B (b.example.org), die viele Interna mit A teilt. Um ein einheitliches Aussehen zu haben, möchte ich das gleiche global_menu.html auf der Site B verwenden und {% url list_users %} wollen Ausgabe " http://a.example.org/users/ ". Wie kann ich das am besten erreichen?

Momentan verwende ich separate global_menu.html für jede Site, aber dies verstößt gegen das DRY-Prinzip und ist nicht wirklich praktisch. Und, ja, ich benutze Djangos contrib.sites -Framework mit distinct SITE_ID s, definiert in settings.py für jede Site, aber benutze sie noch nirgendwo sonst.

Update : Momentan denke ich daran, url tag oder affe-patchen reverse() neu zu implementieren, um das Original aufzurufen, und bei Ausnahmen zusätzliche Suche in einer "fremden URI-Liste" durchzuführen ". Wenn es so etwas schon gibt - ich würde mich freuen zu hören.

Vielen Dank im Voraus für die Antworten!

    
drdaeman 03.08.2009, 10:55
quelle

4 Antworten

12

Ich habe es implementiert, indem ich django.core.urlresolvers.reverse mit meiner benutzerdefinierten Funktion überschrieben habe:

%Vor%

Dann listet URLconfs in settings.py wie folgt auf:

%Vor%     
drdaeman 04.08.2009, 23:21
quelle
2

Ja, Sie müssten Ihr eigenes {% url %} -Tag erstellen, das seine eigene Umkehrmethode verwendet.

Um beispielsweise spezifisch gegen die URL site_a urlconf umzukehren, könnten Sie eine Methode wie folgt verwenden:

%Vor%     
SmileyChris 04.08.2009 21:08
quelle
1

Umgekehrtes Überschreiben für Django 1.7.x mit den gleichen Einstellungen von @drdaeman

%Vor%

Ich habe den Code in die urls.py-Datei gestellt, um beim Start ausgeführt zu werden

    
cwirz 08.01.2015 12:12
quelle
0

Ich würde vorschlagen, zwei Änderungen vorzunehmen. (1) Verschieben Sie Vorlagen in ein gemeinsames Verzeichnis (statt pro Anwendung), wenn Sie dies nicht bereits getan haben. (2) Untersuchen Sie die neu hinzugefügte Funktion Namespaces .

Mit der ersten Änderung können Sie eine gemeinsame Basisvorlage erstellen und diese selektiv für verschiedene Apps / Websites überschreiben. Die zweite könnte dazu dienen, Ihre URLs "trockener" zu machen.

    
Manoj Govindan 03.08.2009 16:53
quelle

Tags und Links