2017-07-31 40 views
1

使用django rest框架我試圖創建一個視圖,允許檢索和更新單個用戶,但我不明白如何去做。目前我不關心權限和身份驗證。基於Django基於GET參數的視圖

views.py

class UserDetailsView(RetrieveUpdateAPIView): 
    def get_object(self, user_id): 
     user = get_user_model().objects.get(pk=user_id) 
     return user 

urls.py

urlpatterns = [ 
    #rest of code 
    url(r'^user/(?P<user_id>[0-9]+)/$', views.UserDetailsView.as_view(), name="profile"), 
] 

,如果我嘗試訪問本地主機:8000 /用戶/ 1,我得到:

TypeError at /user/1/ 
get_object() missing 1 required positional argument: 'user_id' 

Request Method:  GET 
Request URL: http://localhost:8000/user/1/ 
Django Version:  1.11.1 
Exception Type:  TypeError 
Exception Value:  

get_object() missing 1 required positional argument: 'user_id' 

我失去了一些東西因爲基於功能的視圖一切正常。例如:

views.py

def game(request, id_game): 
    # rest of code 

urls.py

url(r'^games/(?P<id_game>[0-9]+)/$', views.game, name="game"), 

回答

2

首先,這是一個kwarg不是arg。有一個區別。因此,您需要在基於類的視圖的def get()中執行user_id=None。您也可以通過self.kwargs['user_id']訪問kwargs。

此外,由於您使用的RetrieveUpdateAPIView你可以只添加屬性的URL PK Kwarg這樣的:

class UserDetailsView(RetrieveUpdateAPIView): 
    lookup_url_kwarg = 'user_id' 

然後你不需要重寫get_object方法。 在這裏的性質一些更多的信息:http://www.django-rest-framework.org/api-guide/generic-views/#genericapiview

注意我鏈接到GenericAPIView這裏,因爲這是從(或類之一)RetrieveUpdateAPIView繼承。

+0

非常感謝您的及時答覆。這解決了我的問題,但我對缺乏良好的文檔感到驚訝。我已經閱讀了該頁面,並且還閱讀了關於基於類的視圖的django文檔頁面,但其中沒有提到如何將參數傳遞給常見的http方法(GET和POST)。如果你能告訴我一個很好的詳細Django指南 –

+0

我只是看看這篇文章中的第一個截屏視頻,如果這是你的風格,我推薦它。它看起來不錯https://stackoverflow.com/a/17414782/4832296 –

2

可以在get_object訪問user_idkwargs

def get_object(self): 
    user_id = self.kwargs['user_id'] 
    ... 

基於類的觀點提供了更大的靈活性和代碼重用,但你需要了解每種方法意味着,當它被調用。通過Django rest框架的文檔。

2

您在urlpatterns中使用自定義kwarg user_id。您需要在View類中設置lookup_url_kwarg

此外,爲了充分利用通用視圖的潛力,您應該設置queryset字段。如果你這樣做,沒有必要重寫get_object方法。

class UserDetailsView(RetrieveUpdateAPIView): 
    queryset = get_user_model().objects.all() 
    lookup_url_kwarg = 'user_id' 
    ...