Bei Django urls.py dynamisch aufbauen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Jurudoca
User
Beiträge: 23
Registriert: Dienstag 26. Juli 2011, 13:58

Hallo leute, ich wollte mir ein kleines cms bauen (ohne flatpages), indem der admin neue seiten anlegen kann. ich habe also eine app mit verschiedenen datenbankfeldern angelegt, die eine statische seite beschreiben. pagetitle, body, url etc.

diese daten lassen sich mit dem django-backend-admin auch wunderbar in die db eintragen. nun wollte ich, dass die seiten, die bis jetzt nur in der db unzusammenhängend schlummern, in die urls.py integrieren, damit die inhalte aus der db zusammenhängend als seite angezeigt werden. Ein datensatz hat z.b. die url (als string in der db gespeichert)"/about", mit dazugehörigem "body" etc.

Wie kann ich django beibringen, dass er in die datenbank gucken soll um url anfragen aufzulösen. Muss ich das in der urls.py machen?
Der Nachteil an url patterns wie diesen:

Code: Alles auswählen

urlpatterns = patterns('',
    (r'^$',home),
    (r'^admin/', include(admin.site.urls)),
    (r'^leistungen',blabla),
)

ist, dass man immer schon wissen muss, was die url ist...aber wie kann ich das dynamisch aus der datenbank auslesen. Soll ich das models.py aus meiner app in die urls.py importieren und über entsprechende datenbakfelder iterieren, um diese dann in das urlpattern einzugeben? Da muss es doch einen leichteren weg geben oder?

Ich hoffe, dass ich mich verständlich machen konnte. Leider hilft mir der verweis auf den url dispatcher (https://docs.djangoproject.com/en/dev/t ... rs.resolve) nicht wirklich weiter
BlackJack

@Jurudoca: Ich weiss nicht ob ich die Frage richtig verstehe, aber du musst doch nur eine URL konfigurieren die einen regulären Ausdruck hat, der für den variablen Teil steht und den auf einen View setzen, der dazu dann die entsprechenden Daten aus der DB holt. Also echt Django-Grundlagen.
Jurudoca
User
Beiträge: 23
Registriert: Dienstag 26. Juli 2011, 13:58

@BlackJack ja das mit den Grundlagen stimmt sicherlich ;-P Ich glaube ich verstehe den Sinn der Dispatchers nicht so richtig. Ich dachte, dass ich, wenn ich www.meineseite.de/super haben will im urls.py sowas wie (r'^super/',blabla) haben sollte. Aber das ist wohl nicht so. Du hast schon recht, man kann da einfach die views.py benutzen um in der DB nachzusehen. Für mich war das nur etwas contraintuitiv. Aber wenn der Dispatcher nur zum matchen der url ist aber eigentlich nicht zur Weiterverarbeitung dient, sondern der view...dann muss ich mir das anders vorstellen. Wäre es nicht effizienter einen regex für jede url zu haben, die dann wiederum mit einer speziellen viewfunktion usgestattet ist, die dann beispielsweise von vorner rein filter verwendet (also nach manier "object.filter()"....?
Aber egal ich glaub ich weiss nun was ich machen kann, Dank dir!
BlackJack

@Jurudoca: Ich weiss immer noch nicht ob ich Dich verstehe!? Du hast schon verstanden, dass der reguläre Ausdruck nicht auf *eine* feste URL passen muss und dass die variablen Teile die in Gruppen zusammengefasst sind, als Argumente an die View-Funktion übergeben werden!? Falls nicht solltest Du ein Tutorial zu Django durcharbeiten. Wie gesagt, das sind Grundlagen.
Benutzeravatar
snafu
User
Beiträge: 6831
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und, falls notwendig, vielleicht auch erstmal informieren, wofür so ein regulärer Ausdruck eigentlich gut ist (Wikipedia o.ä.). Der sorgt nämlich bereits für eine Art von Filterung, wenn er denn mit der richtigen Syntax angewendet wird.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Jurudoca hat geschrieben:Wie kann ich django beibringen, dass er in die datenbank gucken soll um url anfragen aufzulösen. Muss ich das in der urls.py machen?
Dazu gibt es nicht direkt eine Lösung. Leider. Ich hätte auch gern auf die DB verwiesen, aber das geht nicht so ganz, denn die urls.py wird direkt beim starten der Applikation genutzt. Wenn du als zu einem späteren Zeitpunkt neue Seiten in deine DB packst, sehen die anderen Prozesse davon nichts.

In PyLucid habe ich diese urls.py: https://github.com/jedie/PyLucid/blob/m ... ct/urls.py bzw. https://github.com/jedie/PyLucid/blob/m ... id/urls.py

Es gibt ein paar "Statische" urls, wie /admin/... und /permalink/... usw. und der rest wird im view aufgelöst...

IMHO macht das im Grunde jedes CMS in Django so... Ich hätte aber auch gern eine Lösung, um zumindest die urls.py der Plugins dynamisch anhand von DB Einträgen in die globale urls einfügen kann.
Siehe auch http://www.python-forum.de/viewtopic.php?f=3&t=16518

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Jurudoca
User
Beiträge: 23
Registriert: Dienstag 26. Juli 2011, 13:58

@blackjack,@snafu vielen dank nochmals für eure kommentare. das mit den regulären ausdrücken ist mir gut bekannt, auch dass ich schon hier einige parameter an die views.py übergeben kann. Diese Grundfunktionen sind mir verständlich und ich denke, dass ich diese nutzen kann...meien Frage zielte eher auf das, was @jens sagte: hier übrigens danke für den verweis auf http://www.python-forum.de/viewtopic.php?f=3&t=16518 ...das zeigt, dass ich doch nicht ganz bescheuert bin, wenn ich das verhalten von urls.py gerne haben will ;-)
Ich schaue mir mal gleich dein PyLucid an!

Danke Euch allen
Jurudoca
Antworten