如何获得模型的网址?

时间:2019-05-27 21:47:35

标签: django django-models django-views django-urls

鉴于以下情况:

# 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的对象的引用,是否有“正式”或内置的方式来生成URL /books/detail/42/?最好在模板之外,这样我就可以使用JSON进行响应。

还是惯用的方法来对路径元素(booksdetail)进行参数化,然后自己重​​新构建?

2 个答案:

答案 0 :(得分:1)

,您可以将get_absolute_url用于特定于模型的视图,并使用{% url ... %}模板标记来计算视图的名称。

特定于模型的视图

如果Model具有特定的视图以显示详细信息,则可以在模型上实现get_absolute_url [Django-doc],例如:

from django.urls import reverse

class Book(Model):

    def get_absolute_url(self):
        return reverse('book_detail', kwargs={'pk': self.pk})

在这里,我们使用reverse [Django-doc]“作为” path(..., name='book_detail')参数,将pk作为视图的给定视图名称(在您的pk中指定)的URL“计算” self

然后您可以在模板中编写:

<a href="{{ my_object.get_absolute_url }}">{{ my_object }}</a>

使用my_object模板中变量的名称。

请注意,redirect [Django-doc]函数可以理解get_absolute_url,因此您可以在视图中编写return redirect(my_object),它将自动调用get_absolute_url以重定向到正确的看法。

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

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="{% url 'book_detail' pk=my_object.pk %}">{{ my_object }}</a>

来计算URL,就像我们对get_absolute_url所做的一样。但是,它对于其他非特定于模型的视图也很有用。

答案 1 :(得分:0)

您应该使用Django Rest Framework

所有内置的,只需要设置即可。