2017-04-21 4 views
0

Ich bin ziemlich neu zu Django, und ich bin auf der Suche nach einem Slug in Django beim Erstellen eines Back-End ohne Modelle zu definieren. Die URL wird als solche erstellt:wo ein Slug ohne ein Model.py in Django zu definieren

url(r'^main/(?P<slug>[-\w]+)/', include('main.urls')), 

Ich habe Schnecken in meinem main.urls, die ich in jeder View-Funktion definieren. Ich bin mir nicht sicher, wo ich diesen Slug definieren soll (Link, wie immer man ihn nennen mag). Bei anderen Django-Slug-Beispielen ist der übliche Weg ein Modell, und ich spreche gerade mit einem Programm, anstatt eigene Modelle zu erstellen.

Wäre das in der urls.py, oder views.py (im Projekt, nicht App)? Vielen Dank. Hoffentlich ist das verständlich.

+0

'slug' sollte der Parameter für die Anfragefunktionen sein (wie get, post) in Ihrer' Ansichten' Klasse –

+0

habe ich, also sollte ich einen Dekorator auf jede meiner Ansichten setzen (es gibt ungefähr 12 oder so in meinem main.urls), die diesen Parameter definieren würden. Gibt es einen effizienten Weg? – Desario

+1

Ich bin mir nicht sicher, was Sie für die Schnecke * für * wollen. Ein Slug ist eine Möglichkeit, einen bestimmten Datensatz in der db zu identifizieren, sodass er nur bei einem Modell sinnvoll ist. Was genau willst du damit machen? Wenn Sie nur zwischen URLs unterscheiden, die zu verschiedenen Ansichten gehören, ist dies nur ein Standard-URL-Muster und es wird kein Slug benötigt. –

Antwort

0

Es ist nicht schwer. Ja wirklich.

In URL-Konfigurationen ist jeder Eintrag einfach ein regulärer Ausdruck, der mit einer URL übereinstimmen muss, die von einem Endbenutzer besucht wird. r'^main/(?P<slug>[-\w]+)/' wird zum Beispiel Übereinstimmen mit: http://localhost:8000/main/some-slug/

Sie eine besondere Art von Syntax in Ihrem regulären Ausdruck verwenden können, um angepassten Daten zu extrahieren und diese Daten als Variable zu Ihrer Ansicht Funktion übergeben.

das Bit, das das tut, ist es (?P<slug>[-\w]+) Worte (in diesem Fall ein slug) in ein slug genannten variable angepaßten puts (<slug> das Teil, definiert sie die Variablennamen). In diesem bescheidenen Beispiel wird die Slug-Variable auf "some-slug" gesetzt.

Die Variable wird in der Ansicht wie folgt zugänglich:

from django.http import HttpResponse 

def handle_my_view(request, slug=homepage): 
# do stuff with slug  
return HttpResponse("I did stuff with slug: {}".format(slug)) 

Erfahren Sie mehr über, und Geige mit regulären Ausdrücken

Bei http://www.regexr.com

Aber warum sehe ich Butzen In Modellen verwendet ?:

Ein Slug (oder eine benannte Variable, die von einer URL-Interception kommt) kann für alles verwendet werden. Im Allgemeinen wird die Slug-Variable selbst verwendet, um einen Datenbankeintrag einiger Art zu erhalten ... Und das beinhaltet die Verwendung von Modellen.

Sie können tun, was Sie wollen mit ihnen; füge Zeug hinzu, subtrahiere Zeug, kapitalisiere, was auch immer. Der Himmel ist die Grenze.

Aus den Django docs:

https://docs.djangoproject.com/en/1.10/topics/http/urls/#named-groups

Benannte Gruppen

Das obige Beispiel verwendet, um einfache, nicht-genannt regulären Ausdrücken Gruppen (über Klammern) Bits zu erfassen der URL und übergeben Sie sie als Positionsargumente an eine Ansicht. In einer fortgeschritteneren Verwendung ist es möglich, benannte Gruppen mit regulärem Ausdruck zu verwenden, um URL-Bits zu erfassen und sie als Schlüsselwortargumente an eine Ansicht weiterzugeben.

In regulären Python-Ausdrücken ist die Syntax für benannte Gruppen mit regulären Ausdrücken (?Ppattern), wobei name der Name der Gruppe und pattern ein passendes Muster ist.

Hier ist das obige Beispiel URLconf, neu geschrieben benannten Gruppen zu verwenden:

from django.conf.urls import url 

from . import views 

urlpatterns = [ 
    url(r'^articles/2003/$', views.special_case_2003), 
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), 
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), 
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), 
] 

Dies erreicht genau die gleichen wie im vorherigen Beispiel, mit einem feinen Unterschied: Die erfassten Werte werden übergeben Funktionen als Schlüsselwort-Argumente anzuzeigen eher als Positionsargumente. Zum Beispiel:

Eine Anfrage an /articles/2005/03/ würde die Funktion views.month_archive(request, year='2005', month='03') statt views.month_archive(request, '2005', '03') aufrufen. Eine Anfrage an /articles/2003/03/03/ würde die Funktion views.article_detail(request, year='2003', month='03', day='03') aufrufen.

In der Praxis bedeutet dies, dass Ihre URLconfs etwas expliziter und weniger anfällig für Fehler in der Reihenfolge der Argumente sind - und Sie können die Argumente in den Funktionsdefinitionen Ihrer Ansichten neu anordnen. Natürlich gehen diese Vorteile auf Kosten der Kürze; Einige Entwickler finden die Syntax der benannten Gruppe hässlich und zu ausführlich.

Verwandte Themen