如何获得模型的 url?

How do I get the url for a model?

鉴于以下情况:

# 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'))]

我可以在 /books/detail/42/ 加载私钥 ID 为 42 的对象的详细视图。如果我在另一个具有完全不同路径的请求中并持有对私钥 ID 为 42 的对象的引用,是否有 "official" 或内置方法来生成 url /books/detail/42/?最好在模板之外,这样我就可以用 JSON.

来回应

或者是参数化路径元素(booksdetail)并自己重建它的惯用方法?

,可以利用model-specific视图的get_absolute_url{% url ... %}模板标签来计算视图名称.

Model-specific 观看次数

如果 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] 到 "calculate" URL 给定的视图名称(在您的 path(..., name='book_detail') 中指定)和 pk 参数, self.

pk

在你的模板中你可以这样写:

<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重定向正确的观点。

如果您使用 Django REST 框架序列化模型,那么您也可以重用 get_absolute_url,例如使用 URLField [drf-doc]

from rest_framework.serializers import ModelSerializer, URLField

class BookSerializer(serializers.ModelSerializer):

    absolute_url = serializers.URLField(
        read_only=True,
        source='get_absolute_url'
    )

此特定用例记录在 Django REST 框架的文档中。

在模板中使用 {% url ...%}

您还可以使用 {% url ... %} template tag [Django-doc] 计算视图的 URL。例如你可以写:

<a href="<b>{% url 'book_detail' pk=my_object.pk %}</b>">{{ my_object }}</a>

计算 URL,就像我们计算 get_absolute_url 一样。然而,它对于其他非 model-specific 视图也很有用。

你应该使用Django Rest Framework

全部built-in,你只需要设置即可。