/ / Invertir para las vistas genéricas de url - django, django-urls

Reverso para las vistas genéricas de url - django, django-urls

Este tema es la continuación del pensamiento en. este tema. Volví a caer en problema de reversa en genérico.puntos de vista. La última vez pensé que no es una coincidencia inversa porque utilicé muchas y muchas, ahora no tengo muchas relaciones a la inversa, pero el problema sigue ahí. Como tengo una vista genérica en las URL en ambos casos, sugerí que el problema está en las vistas genéricas y no en la función de vista. Al principio utilicé el decorador @permalink en los modelos.

...
@permalink
def get_absolute_url(self):
return ("categories", str(self.id))
...
@permalink
def get_absolute_url(self):
return ("pages", (), {"page_name": self.human_readable_url})

urls

url(r"^(?P<page_name>&w*)?/?$", direct_to_template,
{"template": "basic.djhtml"},
name = "pages"),
url(r"cat/d+/$",
direct_to_template,
{"template": "basic.djhtml"},
name = "categories")

Y consiguió un error:

NoReverseMatch: reverso para "páginas" con argumentos "()" y argumentos de palabras clave "{" nombre_página ": u" página1 "}" no encontrado.

Entonces probé el método inverso

def get_absolute_url(self):
return reverse("categories", args = [self.id, ])

Y tiene el mismo error.

NoReverseMatch: Invertir para "categorías" con argumentos "(2,)" y argumentos de palabra clave "{}" no encontrados.

Basado en el hecho de que permalink no explícitamenteuse el método inverso, creo que el problema está en la interacción inversa y la vista genérica en url. ¿Por qué sucede? ¿Cómo usar reversa en las vistas genéricas de url?

Respuestas

1 para la respuesta № 1

El problema es que has dado el nombre. categories a una vista genérica, direct_to_template, y usted está pasando un argumento a esa vista, pero direct_to_template no toma ese argumento, solo un diccionario que contiene contexto adicional.

Si desea pasar argumentos adicionales a una vista genérica, puede - pero solo se pasarán a la Plantilla. Usted puede ampliar la vista escribiendo su propia función, que agrega el parámetro a un diccionario, luego llama a la vista genérica. Algo como esto:

# views.py
from django.views.generic.simple import direct_to_template

def my_view(id):
more_data = {"id": id}
return direct_to_template(template = "basic.djhtml", more_data)

Y luego en tu urls.py, Reemplace la direct_to_template con my_view. Ya que my_view toma un id argumento, reverse coincidirá correctamente y el argumento se pasará a la vista genérica y a la plantilla.

Presumiblemente en algún lugar de su plantilla hay una línea como, {{ id }}.