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?
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.
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" %}
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).