Si tengo un modelo como este:
class Article(models.Model): title = models.CharField(max_length=200) # ... rest of the code ... def get_absolute_url(self): return reverse('article-detail', args=[str(self.pk)])y tengo un mapeo de URL como este:
url(r'^article/(?P<pk>[0-9]+)/$', views.ArticleView.as_view(), name='article-detail'),En la plantilla debo usar:
<a href="{{ article.get_absolute_url }}">{{ article.title }}</a>o
<a href="{% url 'article-detail' article.pk %}">{{ article.title }}</a>Sigo pensando que ambas son buenas ideas, pero ¿cuál es la mejor?
En el primer código que escribí args=[str(self.pk)] , ¿por qué debo convertir self.pk en una cadena? ¿Las URL deben ser cadenas?
En mi vista genérica, ¿cómo uso la variable pk? Estoy realmente confundido con ese slug_field , slug_url_kwarg , pk_url_kwarg , query_pk_and_slug .
¿Cuál coincide con cuál?
Si configuro query_pk_and_slug en True, slug_field = pk?
En mi opinión, usa
<a href="{{ article.get_absolute_url }}">{{ article.title }}</a>es una mejor práctica. Si más adelante desea cambiar la URL de este recurso, lo hará una vez en su función de modelos y no buscará en cada página de plantilla una referencia a esta URL específica. La filosofía detrás de esto es que la URL de un artículo es un recurso que pertenece al modelo del artículo ( Django: ¿Modelos gordos y controladores delgados? )
Un mejor enfoque es escribir
return reverse('article-detail', kwargs={'pk': self.pk})De esta forma, y al tener múltiples argumentos en tu url, siempre sabrás el valor de cada argumento ( *args y **kwargs? )
No estoy seguro acerca de la última parte de su pregunta. Con todo, pk representa la clave principal, que por defecto (y déjelo así) es el id (producido automáticamente por su base de datos), y slug es un campo único en la base de datos (usted lo especifica en la definición de su modelo) que representa un campo de babosas. Slug se usa cuando prefiere direcciones URL más legibles (seo) como /article/giannis-antetokounmpo-is-the-best, en lugar de /article/404.
Para comprender cómo funcionan las vistas basadas en clases en django (mejor práctica que las basadas en funciones), eche un vistazo a https://ccbv.co.uk/projects/Django/1.10/django.views.generic.detail/DetailView/ por ejemplo . Cuando se llama al GET (método http), se llama como resultado a la función get del modelo. Si nota, hay una función self.get_object(). En la definición de get_object(), puede ver la lógica que está buscando. Específicamente, en los comentarios, puede ver todas las formas en que View está tratando de encontrar el único objeto para devolver. Debe elegir uno, especificando las variables apropiadas.
La url tag hará la operación inversa y generará una ruta de url, donde get_absolute_url debe definirse en un modelo, ya que esto es para obtener la url para un objeto en particular.
Aquí hay una publicación que explica get_absolute_url