La documentación de Django dice:
get_absolute_url()para decirle a Django cómo calcular la URL canónica de un objeto.
¿Qué significa URL canónica en este contexto?
Sé desde una perspectiva de SEO que la URL canónica significa elegir la mejor URL de las URL de aspecto similar ( example.com , example.com/index.html ). Pero este significado no encaja en este contexto.
Sé que este método proporciona alguna funcionalidad adicional en la administración de Django, redirección, etc. Y soy plenamente consciente de cómo usar este método.
Pero, ¿cuál es la filosofía detrás de esto? Nunca lo he usado en mis proyectos. ¿Sirve para algún propósito especial?
En primer lugar, cuando se trata de desarrollo web, realmente desea evitar rutas de codificación difíciles en sus plantillas. La razón de esto es que las rutas pueden cambiar, y será una molestia revisar todo su HTML y plantillas para encontrar cada URL o ruta y actualizarla manualmente. Hace que su código sea mucho más difícil de mantener.
La solución a esto es definir funciones que devuelvan la URL en su lugar. Aquí es donde get_absolute_url() entra en escena.
Ejemplo:
<!-- Bad --> <a href="/language/category/product/{{product.pk}}">Link</a> <!-- Good --> <a href="{{product.get_absolute_url}}">Link</a>Su segunda pregunta es qué es una URL canónica. Una URL canónica es la URL "oficial" de una página determinada. A veces, un activo se puede mostrar en varias URL diferentes, por ejemplo:
/en/shoes/1-nike-shoes/ /en/shoes/1-nike-shoes?sort=price&order=asc /en/shoes/1-nike-shoes?sort=price&order=desc Aquí tenemos el mismo activo mostrado en 3 URL diferentes. La "URL canónica" sería la que definimos como principal. Por ejemplo /en/shoes/1-nike-shoes/ .
Es muy útil para definir qué es una URL oficial o "principal" para un determinado activo. Le permitirá evitar contenido duplicado cuando los motores de búsqueda indexen su sitio web.
En el contexto de la cita que está utilizando de la documentación de Django. "Canonical" en este caso significa "la URL oficial donde se muestra este modelo".
Mira este ejemplo:
Quiero generar una URL única para cada producto, el patrón será: http://...../products/abcdefg/ (después de '/products/' es mi valor de slug).
En models.py, creé el 'get_absolute_url' que generará la URL en el patrón anterior
modelos.py
class Products(models.Model): title = models.CharField(max_length=120) slug = models.SlugField(blank=True, unique=True) description = models.TextField() def get_absolute_url(self): return f"/products/{self.slug}/"productlist.html - get_absolute_url referido en la etiqueta de anclaje
{% for obj in object_list %} <a href="{{obj.get_absolute_url}} ">{{obj.title}}</a> <br> {% endfor %}urls.py - mi patrón de URL
path('/products/<slug>/', ProductDetails.as_view()),Usted crea modelos para su sitio web. Cuando se crea una nueva instancia para un modelo, Django debe saber a dónde ir cuando se crea una nueva publicación o una nueva instancia.
Aquí get_absolute_url viene en la imagen. Le dice a Django a dónde ir cuando se crea una nueva publicación.