鉴于以下情况:
# 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进行响应。
还是惯用的方法来对路径元素(books
和detail
)进行参数化,然后自己重新构建?
答案 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)
所有内置的,只需要设置即可。