是在Django的REST框架,可以在每個記錄在ModelViewSet 列表視圖鏈接到詳細查看對於該id
字段中添加HyperLink
記錄?在Django的休息框架的超鏈接添加到ModelViewSet
documentation說要添加一個view_name
的參數,但這是可能做到ModelViewSet
下,因爲視圖實際上並沒有名稱?
是在Django的REST框架,可以在每個記錄在ModelViewSet 列表視圖鏈接到詳細查看對於該id
字段中添加HyperLink
記錄?在Django的休息框架的超鏈接添加到ModelViewSet
documentation說要添加一個view_name
的參數,但這是可能做到ModelViewSet
下,因爲視圖實際上並沒有名稱?
首先,所有ModelViewSet url都有名稱,即使您不明確設置這些名稱。
你可以找出默認的網址是如何在路由器內創建,在文檔:http://www.django-rest-framework.org/api-guide/routers/(見「SimpleRouter」 URL名稱表)
要查看應用程序中的所有可用實際的URL名稱,試着用此實用程序:
def print_url_pattern_names(patterns):
"""Print a list of urlpattern and their names"""
for pat in patterns:
if pat.__class__.__name__ == 'RegexURLResolver': # load patterns from this RegexURLResolver
print_url_pattern_names(pat.url_patterns)
elif pat.__class__.__name__ == 'RegexURLPattern': # load name from this RegexURLPattern
if pat.name is not None:
print '[API-URL] {} \t\t\t-> {}'.format(pat.name, pat.regex.pattern)
然後,在你的urls.py:
urlpatterns = [
url(r'^', include(router.urls)),
]
if settings.DEBUG:
print_url_pattern_names(urlpatterns)
如果你想要的網址是來自您的ModelViewSet's名不同(如在我的情況),你可以將其設置爲「BASE_NAME」在路由器上:
router.register('contents', media_views.MediaViewSet, base_name='contents')
接下來的事情you'll需求正在擴大HyperlinkedModelSerializer:
from rest_framework import serializers
# in this sample my object is of type "Media"
class MediaSerializer(serializers.HyperlinkedModelSerializer):
#blablabla
你必須準備的超鏈接顯示爲串行您的詳細信息視圖,但只有一個必要的步驟可供使用。 That's其中 「VIEW_NAME」 進來:
from rest_framework import serializers
class MediaSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Media
fields = ('url', ...[other fields you want to serialize])
extra_kwargs = {
'url': {'view_name': 'contents-detail'}
}
這是從樣品HTTP響應(見URL字段):
這裏要設置'」 contents-detail'作爲url名稱。你需要在'urls.py'中聲明這個URL嗎? –
不需要。如上所述,路由器/ modelViewSet將爲您創建網址:http://www.django-rest-framework.org/api-guide/routers/。但在我個人的情況下,考慮到我希望URL以「內容」而不是「媒體」開頭,我在urls.py上設置了該位置(編輯帖子) – xleon
我刪除了view_name的'extra_kwargs',因爲它不是在'HyperlinkedModelSerializer'中不需要它,它就起作用了。此外,這個答案幫助我得到它的工作:http://stackoverflow.com/a/20553926/1913888。我仍然爲您的答案提供+1。謝謝。 –