如何获得模型的 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.
来回应
或者是参数化路径元素(books
和 detail
)并自己重建它的惯用方法?
是,可以利用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 视图也很有用。
全部built-in,你只需要设置即可。
鉴于以下情况:
# 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.
或者是参数化路径元素(books
和 detail
)并自己重建它的惯用方法?
是,可以利用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 视图也很有用。
全部built-in,你只需要设置即可。