簡體   English   中英

在django-rest-framework中將HyperLink添加到ModelViewSet

[英]Add a HyperLink in django-rest-framework to a ModelViewSet

是否有可能在Django Rest Framework中在ModelViewSet 列表視圖中的每個記錄的id字段上添加一個HyperLink ,鏈接到該記錄的詳細信息視圖

文檔說要添加一個view_name參數,但是這可以在ModelViewSet下進行,因為視圖實際上沒有名稱嗎?

首先,所有ModelViewSet網址都有名稱,即使您沒有明確設置這些名稱。

您可以在文檔中找到如何在路由器中創建默認網址: http//www.django-rest-framework.org/api-guide/routers/ (請參閱'SimpleRouter'網址名稱表)

要查看應用程序中可用的所有實際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)

如果您希望url與ModelViewSet的名稱不同(在我的情況下),您可以使用“base_name”在路由器上設置它:

router.register('contents', media_views.MediaViewSet, base_name='contents')

接下來你需要的是擴展HyperlinkedModelSerializer:

from rest_framework import serializers
# in this sample my object is of type "Media"
class MediaSerializer(serializers.HyperlinkedModelSerializer):
    #blablabla

您將准備好序列化程序以顯示指向詳細信息視圖的超鏈接,但還有一個必需步驟可供使用。 這就是“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'}
        }
  1. “url”字段是必填字段以顯示鏈接。
  2. 使用'extra_kwargs'> view_name,您告訴框架您的詳細信息視圖的名稱是'content-detail'。
  3. 'content-detail'只是我的視圖名稱。 你需要找到你的(從上面的網址名稱實用程序)

這是樣本的http響應(參見url字段):

在此輸入圖像描述

對xleon的回答幾乎沒有更新:

使用Python 3和新的Django,函數來查看所有urlpatterns你應該使用這樣的東西:

def print_url_pattern_names(patterns):
    """Print a list of urlpattern and their names"""
    for pat in patterns:
        if pat.__class__.__name__ == 'URLResolver':      # load patterns from this URLResolver
            print_url_pattern_names(pat.url_patterns)
        elif pat.__class__.__name__ == 'URLPattern':     # load name from this URLPattern
            if pat.name is not None:
                print('[API-URL] {:>50} -> {}'.format(pat.name, pat.pattern))

我花了一些時間來解決它,所以也許它會幫助某人。

我是如何使用它的:然后運行“python manage.py shell”

import urls

然后復制此函數並像這樣運行:

print_url_pattern_names(urls.urlpatterns)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM