Как я могу получить URL для модели? - PullRequest
2 голосов
/ 28 мая 2019

Учитывая следующую ситуацию:

# models.py
class Book(Model):
    pass

# views.py
class BookDetail(DetailView):
    model = Book


# books/urls.py
urlpatterns += [path('detail/<int:pk>', BookDetail.as_view(), 'book_detail')]

# page/urls.py
urlpatterns += [path('books/', include('books.urls'))]

Я могу загрузить подробное представление для объекта с идентификатором 42 закрытого ключа в /books/detail/42/.Если я нахожусь в другом запросе с совершенно другим путем и держу ссылку на объект с секретным ключом с идентификатором 42, существует ли «официальный» или встроенный способ генерирования URL /books/detail/42/?Желательно вне шаблонов, чтобы я мог ответить JSON.

Или это идиоматический способ параметризации элементов пути (books и detail) и просто перестроить его самому?

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Да , вы можете использовать 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. Это также полезно для других, не зависящих от модели представлений.

0 голосов
/ 28 мая 2019

Вы должны использовать Django Rest Framework

Все встроенное, вам просто нужно настроить.

...