En mi 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 yo 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 puedo cambiar el patrón de URL a sólo requieren de un solo argumento que 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 %}

De lo que parece quejarse cuando me pase más de un argumento mediante la ‘dirección’ de la plantilla de etiqueta – me sale el mismo error con dos argumentos. Es allí una manera diferente de pasar varios argumentos? He intentado pasar en nombre de la palabra clave argumentos y que genera un error similar.

Para lo que vale, los relacionados con la vista comienza así:

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

¿Cómo puedo pasar más de un solo argumento a la dirección url de la plantilla de etiqueta?

InformationsquelleAutor Phil Gyford | 2010-01-22

3 Comentarios

  1. 8

    El problema de la vida en la /(?P<month>\d{2})/ parte de la configuración de la dirección url. Sólo se permite exactamente dos dígitos ( \d{2} ), mientras que issue.pub_date.month es sólo un dígito.

    Puede permitir también un dígito en la URL (pero esto viola el principio de direcciones Url únicas, /2010/1/... sería el mismo que /2010/01/...) o pasar dos dígitos para el mes argumento en su url templatetag.

    Usted puede utilizar el date filtro de lograr una consistente formato de fecha objetos. El uso de la dirección url de la etiqueta como esta:

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

    Mirada en el mes y el día argumento: siempre se muestra como dos dígitos (con un cero a la izquierda si es necesario). Eche un vistazo a la la documentación de la etiqueta de ahora para ver que opciones son posibles para el date filtro.

    • Eso suena muy bien – en realidad no quiero tener cambiar el posible formato para la dirección URL. Pero cuando hago problema.pub_date.mes|fecha:»m», a continuación, una cadena vacía se pasa a la URL/vista.
    • Tienes razón – lo siento. Obviamente me había equivocado en el post original. He corregido el url etiqueta. Debe utilizar issue.pub_date|date:"m" en lugar de issue.pub_date.month|date:"m". El date filtro funciona en datetime objetos (el pub_date atributo) y no en números enteros (el pub_date.mes de atributo).
    • Doh, por supuesto, debo haber descubierto que también. Gracias de cargas para la ayuda Gregor.
  2. 13

    Yo tenía el mismo problema (estoy usando Django 1.3.1) y trató de Gregor Müllegger la sugerencia, pero que no funciona por dos razones:

    • no debe haber ningún comas entre año, mes y día en que los valores
    • mi clase genérica vista parece tomar sólo los parámetros de palabra clave

    Por lo tanto la única solución de trabajo fue:

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

    El mes de expresión es (?P<month>\d{2}), pero tienes que enviar el argumento 1. El 1 no coincide con \d{2}, por lo que la resolución de dirección url no es la búsqueda de su vista.

    Intente cambiar el mes de expresión a \d{1,2} (o algo a ese efecto).

    • Muchas gracias por tu sugerencia, Seth – yo no había hecho la conexión entre la regexp y lo que yo estaba tratando de pasar a ella. Pero yo no quería aflojar la restricción en la URL, así que ahora estoy cambiando el formato de lo que me pase, el uso de Gregor Müllegger la sugerencia.

Dejar respuesta

Please enter your comment!
Please enter your name here