Да , вы можете использовать get_absolute_url
для видов, специфичных для модели, и шаблонный тег {% url ... %}
для вычисления имени вида.
Виды, специфичные для модели
Если Model
имеет специфическое представление для отображения деталей, вы можете реализовать get_absolute_url
[Django-doc] на вашей модели, как:
from django.urls import <b>reverse</b>
class Book(Model):
def <b>get_absolute_url</b>(self):
return <b>reverse</b>('book_detail', kwargs={'pk': self.pk})
Здесь мы используем reverse
[Django-doc] , чтобы «вычислить» URL для данного имени представления (указанного в вашем path(..., name='book_detail')
) с помощью pk
параметр, pk
из self
.
В своем шаблоне вы можете написать:
<a href="<b>{{ my_object.get_absolute_url }}</b>">{{ my_object }}</a>
с my_object
именем переменной в вашем шаблоне.
Следует отметить, что функция redirect
[Django-doc] понимает get_absolute_url
, и, таким образом, вы можете написать return redirect(my_object)
в представлении, и оно будет автоматически позвоните get_absolute_url
, чтобы перенаправить на нужный экран.
Если вы сериализуете модель с помощью инфраструктуры REST Django, то вы также можете повторно использовать get_absolute_url
, используя, например, URLField
[drf-doc] :
from rest_framework.serializers import ModelSerializer, <b>URLField</b>
class BookSerializer(serializers.ModelSerializer):
absolute_url = serializers.URLField(
read_only=True,
<b>source='get_absolute_url'</b>
)
Этот конкретный вариант использования задокументирован в документации инфраструктуры REST Django.
Использование {% url ...%}
в шаблоне
Вы также можете рассчитать URL вида, используя шаблонный тег {% url ... %}
[Django-doc] . Например, вы можете написать:
<a href="<b>{% url 'book_detail' pk=my_object.pk %}</b>">{{ my_object }}</a>
для вычисления URL, как мы это делали с get_absolute_url
. Это также полезно для других, не зависящих от модели представлений.