Hallo allerseits,
am Schluss vom 3. Teil des Django-Tutorials wird beschrieben, wie man die URLconf der Applikation von der URLconf des Projekts trennt.
Geht so etwas auch in Templates ?
Ich würde in meinen Templates nur ungern relative Links verwenden müssen ... Absolute Links lassen sich besser mit der Liste in "urls.py" vergleichen ...
(Rein theoretisch müsste es gehen ... ich habe den Verdacht, das die "Admin"-Applikation genau das macht ...)
Vermeiden von relativen URLs in Django-Templates möglich ?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Klar, schreib ich deine Templates einfach statt relativer URLs. Ich mache es nicht, weil mir das etwas arg hardcoded scheint.
Code: Alles auswählen
<a href="http://dein.host.tld/django/irgendwas/">link</a>
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Nicht ganz was ich meinte ...
Ich habe im Projekt und in der Applikation eine "urls.py".
Die Applikations-"urls.py" wird in der Projekt-"urls.py" included.
Auf diese Art ist die Applikation etwas unabhängiger ...
Jetzt würde ich sowas gerne auch in den Templates der Applikation haben.
Statt
hätte ich dann so was wie
Ich habe im Projekt und in der Applikation eine "urls.py".
Die Applikations-"urls.py" wird in der Projekt-"urls.py" included.
Auf diese Art ist die Applikation etwas unabhängiger ...
Jetzt würde ich sowas gerne auch in den Templates der Applikation haben.
Statt
Code: Alles auswählen
<a href="/testapp/liste/">Übrsicht</a>
Code: Alles auswählen
<a href="{{base url }}liste/">Übersicht</a>
-
- User
- Beiträge: 3
- Registriert: Donnerstag 21. Dezember 2006, 12:45
Hi midan23,midan23 hat geschrieben: Statthätte ich dann so was wieCode: Alles auswählen
<a href="/testapp/liste/">Übrsicht</a>
Code: Alles auswählen
<a href="{{base url }}liste/">Übersicht</a>
ja, das geht. Einfach einen Eintrag in deiner settings.py vornehmen, der auf deine Applikation zeigt, also so was wie
base_url = "myapp/"
In den Templates kannst du das dann als {{ settings.base_url }} ansprechen.
Schade, dass Django die Generierung solcher URLs nicht als Helper anbietet, das ist *imho* bei TurboGears und Pylons wesentlich eleganter gelöst.
Gruss, concept!er
Dies URL-Geschichte ist schon etwas verwirrend ...
Einerseits sollen Django-Applikationen unabhängig sein, andererseits gibt es scheinbar keine einfache Möglichkeit, die URLs in Templates unabhängig zu machen (und relative URLs sind nicht immer nutzbar ...)
Einerseits sollen Django-Applikationen unabhängig sein, andererseits gibt es scheinbar keine einfache Möglichkeit, die URLs in Templates unabhängig zu machen (und relative URLs sind nicht immer nutzbar ...)
Irgend etwas scheine ich da übersehen zu haben ... "{{ settings.base_url }}" ist immer leer ...concept!er hat geschrieben: ja, das geht. Einfach einen Eintrag in deiner settings.py vornehmen, der auf deine Applikation zeigt, also so was wie
base_url = "myapp/"
In den Templates kannst du das dann als {{ settings.base_url }} ansprechen.
-
- User
- Beiträge: 3
- Registriert: Donnerstag 21. Dezember 2006, 12:45
Oopsmidan23 hat geschrieben:Irgend etwas scheine ich da übersehen zu haben ... "{{ settings.base_url }}" ist immer leer ...

from django.conf import settings
def index(request):
context=Context({'settings':settings, .... deine restlichen template-Variablen...})
return HttpResponse(template.render(context))
Damit sollte es dann gehen!
Simple is better than complex.
Dann fällt diese Lösung flach (zu umständlich) ... in der "urls.py" der Applikation sind 13 Zeilen, und nur 5 davon verwenden Funktionen aus der "views.py" ... der Rest verwendet Generic Views.
Ich werd mich mal in Richtung "custom template tag" oder "middleware" umschauen ...
Irgendwie muss es doch gehen, ohne das man umständliche Verrenkungen machen muss ...
Ich werd mich mal in Richtung "custom template tag" oder "middleware" umschauen ...
Irgendwie muss es doch gehen, ohne das man umständliche Verrenkungen machen muss ...
Ich hab jetzt was, was seinen Zweck erfüllt ... Ist weder middleware noch ein custom template tag, sondern ein context processor:
Es ist zwar ein Schritt in die richtige Richtung, aber irgendwie gefällts mir nicht ... Verbesserungsvorschläge sind willkommen ...
Ach ja, zur Verwendung sollte in der "settings.py" so was stehen:
Code: Alles auswählen
def application_base_url(request):
from django.conf import settings
urlconf = __import__(settings.ROOT_URLCONF)
for url in urlconf.urls.urlpatterns:
match = url.regex.match(request.META['PATH_INFO'][1:])
if match:
base_url = "/%s" % match.string[match.start():match.end()]
return {"application_base_url": base_url}
Ach ja, zur Verwendung sollte in der "settings.py" so was stehen:
Code: Alles auswählen
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"mysite.testapp.context_processors.application_base_url",
)