template - Django-Cómo pasar varios argumentos a la etiqueta de la plantilla url
django templates examples (3)
En mis urls.py tengo:
(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''
),
Y estoy tratando de hacer esto en una plantilla:
{% url paper_issue_section_detail issue.pub_date.year,issue.pub_date.month,issue.pub_date.day,section_li.slug %}
pero me sale este error:
TemplateSyntaxError
Caught an exception while rendering: Reverse for ''paper_issue_section_detail'' with arguments ''(2010, 1, 22, u''business'')'' and keyword arguments ''{}'' not found.
Sin embargo, si cambio el patrón de URL para que solo requiera un solo argumento, funciona bien. es decir:
(r''^(?P<year>/d{4})/$'',
''paper.views.issue_section_detail'',
{},
''paper_issue_section_detail''
),
y:
{% url paper_issue_section_detail issue.pub_date.year %}
Así que parece quejarme cuando paso más de un solo argumento utilizando la etiqueta de la plantilla ''url''. Recibo el mismo error con dos argumentos. ¿Hay alguna forma diferente de pasar varios argumentos? He intentado pasar argumentos de palabras clave con nombre y eso genera un error similar.
Para lo que vale, la vista relacionada comienza así:
def issue_section_detail(request, year, month, day, slug):
¿Cómo paso más de un solo argumento a la etiqueta de la plantilla url?
El problema se encuentra en /(?P<month>/d{2})/
parte de su configuración de URL. Solo permite exactamente dos dígitos ( /d{2}
) mientras que issue.pub_date.month
es solo un dígito.
También puede permitir un dígito en la URL (pero esto violará el principio de las URL únicas, /2010/1/...
sería lo mismo que /2010/01/...
) o pasará dos dígitos a Argumento de mes en tu url templatetag.
Puede utilizar el filtro de date
para lograr un formateo consistente de los objetos de fecha. Utilice la etiqueta url de esta manera:
{% url paper_issue_section_detail issue.pub_date|date:"Y",issue.pub_date|date:"m",issue.pub_date|date:"d",section_li.slug %}
Mire el argumento del mes y el día: siempre se mostrará como dos dígitos (con un cero inicial si es necesario). Consulte la documentación de la etiqueta ahora para ver qué opciones son posibles para el filtro de date
.
Su expresión del mes es (?P<month>/d{2})
, pero le está enviando el argumento 1
. El 1
no coincide con /d{2}
, por lo que el resolvedor de url no encuentra su vista.
Intente cambiar la expresión del mes a /d{1,2}
(o algo a ese efecto).
Tuve el mismo problema (uso Django 1.3.1) y probé la sugerencia de Gregor Müllegger, pero no funcionó por dos razones:
- No debe haber comas entre los valores de año, mes y día.
- mi vista genérica basada en clase parece tomar solo argumentos de palabras clave
Así, la única solución de trabajo era:
{% url news_detail slug=object.slug year=object.date|date:"Y" month=object.date|date:"m" day=object.date|date:"d" %}