[Django] Wie erstelle ich einen Link auf eine andere Seite?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Mittwoch 21. Januar 2009, 16:06

Hallo,

ich habe heute angefangen, mich mit Django zu beschäftigen. Dabei habe ich mit diversen Anleitungen und Beispielen aus dem Internet gespielt.
Leider hänge ich nun fest und komme nicht mehr weiter.
Hier meine urls.py:

Code: Alles auswählen

from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^versuch/', include('wxpython.foo.urls')),
    
    (r'^meldungen/', 'versuch.article.views.VerzeichnisMeldung'),
    (r'^meldungen/(?P<meldungs_id>\d+)/$', 'versuch.article.views.EineMeldung'),
   
    # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
    # to INSTALLED_APPS to enable admin documentation:
    #(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    (r'^admin/', include(admin.site.urls)),
)
und meine views.py:

Code: Alles auswählen

from versuch.article.models import Meldung
from django.shortcuts import render_to_response

    
def VerzeichnisMeldung(request):
    meldungen = Meldung.objects.order_by('-zeitstempel')[:10]
    return render_to_response('meldungen.html', {'meldungen': meldungen})

def EineMeldung(request, meldungs_id):
    meldung = Meldung.objects.get(pk=meldungs_id)
    return render_to_response('meldungsausgabe.html', {'meldung': meldung})
Wenn ich nun im Browser die Adresse 'http://127.0.0.1:8000/meldungen/' eingebe, werden wie erwartet die Titel der einzelnen Meldungen angezeigt. Dafür verwende ich folgendes Template:

Code: Alles auswählen

{% extends "base.html" %}

{% block title %}Meldungen{% endblock %}

{% block content %}
    <h1>Meldungen</h1>
    <ul>
		{% for meldung in meldungen %}
			<li><a href="{{ meldung.id }}/">{{ meldung.titel|escape }}</a></li>
        {% endfor %}
    </ul>
{% endblock %}
Klicke ich nun einen Titel an, so wird die Adresszeile im Browser um die ID erweitert (z.B. 'http://127.0.0.1:8000/meldungen/2/'). Im Fenster wird die Meldung aber nicht angezeigt. Wenn ich auf eine andere Meldung klicke, wird auch diese ID der Adresszeile zugefügt ('http://127.0.0.1:8000/meldungen/2/4/').
Die ausgewählte Meldung soll in folgenden Template angezeigt werden:

Code: Alles auswählen

{% extends "base.html" %}

{% block title %}{{ meldung.titel|escape }}{% endblock %}

{% block content %}
    <h1>{{ meldung.titel|escape }}</h1>
    <p>
        {{ meldung.text|escape|urlize }}
    </p>
{% endblock %}
Was muss ich ändern, damit der Link funktioniert?

Grüße
Mawilo
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Mittwoch 21. Januar 2009, 17:25

... da sitzt man stundenlang und probiert und kaum hat man das Problem gepostet, findet man die Lösung :lol:

Das Problem liegt in der urls.py. Da die regulären Ausdrucke der Reihe nach ausprobiert werden, muss der "speziellste" Ausdruck an erster Stelle stehe. In meinem Beispiel passt leider der erste Eintrag auf alle Seiten :oops:

Ich musste nur die Zeilen 11 und 12 tauschen und schon hat es funktioniert.

Mawilo
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Mittwoch 21. Januar 2009, 18:23

Du könntest auch das wunderbare {% url namederurl [parameter1[, paramter2] %} verwenden.

Code: Alles auswählen

urlpatterns = patterns('',
    (r'^meldungen/', 'versuch.article.views.VerzeichnisMeldung'),
    (r'^meldungen/(?P<meldungs_id>\d+)/$', 'versuch.article.views.EineMeldung', name="meldung"),

Code: Alles auswählen

<a href="{%url meldung 5 %}">
oder auch
<a href="{% url meldung deine_variable_mit_einer_id %}">
Gruß
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Mittwoch 21. Januar 2009, 21:31

Ja, dass scheint mir Sinn zu machen. Ich werde diese Variante einbauen, um vor weiteren Überraschungen bei der Url-Erkennung sicher zu sein.

Grüße
Mawilo
Antworten