21 Stimmen

Django - Wie man mehrere Argumente an das URL-Template-Tag übergibt

Im urls.py habe ich:

(r'^(?P\d{4})/(?P\d{2})/(?P\d{2})/section/(?P[-\w]+)/$', 
    'paper.views.issue_section_detail', 
    {}, 
    'paper_issue_section_detail'
),

und ich versuche dies in einer Vorlage zu tun:

{% url paper_issue_section_detail issue.pub_date.year,issue.pub_date.month,issue.pub_date.day,section_li.slug %}

aber ich erhalte diesen Fehler:

TemplateSyntaxError
Caught an exception while rendering: Reverse for 'paper_issue_section_detail' with arguments '(2010, 1, 22, u'business')' and keyword arguments '{}' not found.

Wenn ich jedoch das URL-Muster ändere, um nur ein Argument zu benötigen, funktioniert es einwandfrei. z.B.:

(r'^(?P\d{4})/$', 
    'paper.views.issue_section_detail', 
    {}, 
    'paper_issue_section_detail'
),

und:

{% url paper_issue_section_detail issue.pub_date.year %}

Es scheint also zu klagen, wenn ich mehr als ein einzelnes Argument mit dem 'url' Vorlagetag übergebe - ich erhalte den gleichen Fehler bei zwei Argumenten. Gibt es eine andere Möglichkeit, mehrere Argumente zu übergeben? Ich habe versucht, benannte Schlüsselwortargumente zu übergeben, und das erzeugt einen ähnlichen Fehler.

Was den entsprechenden View betrifft, beginnt er so:

def issue_section_detail(request, year, month, day, slug):

Wie übergebe ich mehr als ein einzelnes Argument an den url-Vorlagetag?

13voto

Vlad T. Punkte 2408

Ich hatte dasselbe Problem (ich benutze Django 1.3.1) und habe Gregor Müllergers Vorschlag ausprobiert, aber das hat aus zwei Gründen nicht funktioniert:

  • es sollten keine Kommas zwischen den Jahres-, Monats- und Tageswerten stehen
  • meine klassenbasierte generische Ansicht scheint nur Schlüsselwortargumente zu akzeptieren

Daher war die einzige funktionierende Lösung:

{% url news_detail slug=object.slug year=object.date|date:"Y" month=object.date|date:"m" day=object.date|date:"d" %}

8voto

Gregor Müllegger Punkte 4823

Das Problem liegt im /(?P\d{2})/ Teil Ihrer URL-Konfiguration. Es erlaubt nur genau zwei Ziffern (\d{2}), während issue.pub_date.month nur eine Ziffer ist.

Sie können entweder auch eine Ziffer in der URL zulassen (aber dies würde das Prinzip eindeutiger URLs verletzen, /2010/1/... wäre das gleiche wie /2010/01/...) oder zwei Ziffern an das Monatsargument in Ihrem URL-Vorlagetag übergeben.
Sie können den date-Filter verwenden, um eine konsistente Formatierung von Datumsobjekten zu erreichen. Verwenden Sie den URL-Tag so:

{% url paper_issue_section_detail issue.pub_date|date:"Y",issue.pub_date|date:"m",issue.pub_date|date:"d",section_li.slug %}

Schauen Sie sich das Monats- und Tagargument an: Es wird immer als zwei Ziffern angezeigt (mit einer führenden Null, wenn nötig). Werfen Sie einen Blick auf die Dokumentation des now-Tags, um zu sehen, welche Optionen für den date-Filter möglich sind.

0 Stimmen

Das klingt super - ich möchte wirklich nicht die mögliche Formatierung für die URL ändern. Aber wenn ich issue.pub_date.month|date:"m" dann wird ein leerer String an die URL/view übergeben.

1 Stimmen

Du hast recht - es tut mir leid. Offensichtlich hatte ich es im Originalbeitrag falsch. Ich habe das url tag korrigiert. Du musst issue.pub_date|date:"m" anstelle von issue.pub_date.month|date:"m" verwenden. Der date Filter arbeitet auf datetime Objekten (dem pub_date Attribut) und nicht auf ganzen Zahlen (dem pub_date.month Attribut).

0 Stimmen

Doh, natürlich, das hätte ich auch sehen sollen. Vielen Dank für die Hilfe Gregor.

5voto

Seth Punkte 42154

Dein Monatsausdruck ist (?P\d{2}), aber du sendest das Argument 1. Das 1 passt nicht zu \d{2}, deshalb findet der URL-Auflöser deine Ansicht nicht.

Versuche den Monatsausdruck zu ändern in \d{1,2} (oder etwas in der Art).

0 Stimmen

Vielen Dank für Ihren Vorschlag, Seth - Ich hatte die Verbindung zwischen dem regulären Ausdruck und dem, was ich übergeben wollte, nicht hergestellt. Aber ich wollte die Einschränkung der URL nicht lockern, also ändere ich jetzt das Format dessen, was ich übergebe, nach Gregor Mülleggers Vorschlag.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X