Django - Comment passer plusieurs arguments à la balise de modèle d'url

Dans mon urls.py j'ai:

(r'^(?P<year>d{4})/(?P<month>d{2})/(?P<day>d{2})/section/(?P<slug>[-w]+)/$', 
    'paper.views.issue_section_detail', 
    {}, 
    'paper_issue_section_detail'
),

et je suis en train de le faire dans un template:

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

mais j'obtiens cette erreur:

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

cependant, si je change le modèle D'URL pour n'avoir besoin que d'un seul argument, cela fonctionne très bien. ie:

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

et:

{% url paper_issue_section_detail issue.pub_date.year %}

il semble donc se plaindre quand je passe plus d'un argument en utilisant la balise 'url' template - j'obtiens la même erreur avec deux arguments. Est-il un autre moyen de passer plusieurs arguments? J'ai essayé de passer dans les arguments de mot-clé nommés et cela génère une erreur similaire.

Pour ce que ça vaut, la vue commence comme ceci:

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

Comment passer plus d'un argument à la balise url template?

21
demandé sur Phil Gyford 2010-01-22 21:18:42

3 réponses

Le problème de la vie dans le /(?P<month>\d{2})/ fait partie de votre configuration d'url. Il permet d'effectuer exactement deux chiffres (\d{2}) tandis que issue.pub_date.month n'est qu'un chiffre.

vous pouvez faire soit autoriser aussi un chiffre dans L'URL (mais cela violera le principe des URLs uniques,/2010/1/... serait le même que /2010/01/...) ou passer deux chiffres à l'argument de mois dans votre templatetag url.

Vous pouvez utiliser le date filtre pour obtenir un formatage cohérent des objets date. Utilisez la balise url comme ceci:

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

regardez l'argument mois et jour: il sera toujours affiché en deux chiffres (avec un zéro de tête si nécessaire). Jetez un oeil à l' la documentation de la balise pour voir quelles options sont possibles pour date filtre.

8
répondu Gregor Müllegger 2010-01-23 12:01:34

j'ai eu le même problème (J'utilise Django 1.3.1) et essayé la suggestion de Gregor Müllegger, mais cela n'a pas fonctionné pour deux raisons:

  • il ne devrait pas y avoir de virgule entre les valeurs de l'Année, du mois et du jour
  • ma classe générique point de vue semble prendre que le mot arguments

ainsi la seule solution de travail était:

{% url news_detail slug=object.slug year=object.date|date:"Y" month=object.date|date:"m" day=object.date|date:"d" %}
12
répondu Vlad T. 2012-03-11 14:44:13

votre expression de mois est (?P<month>\d{2}), mais vous l'envoyez à l'argument 1. 1 ne correspond pas \d{2}, donc le résolveur d'url ne trouve pas votre vue.

essayez de changer l'expression du mois en \d{1,2} (ou quelque chose à cet effet).

5
répondu Seth 2010-01-22 19:06:56