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 № 1El 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 }}
.