带有 GET 参数的基于 Django 类的视图

Mr.*_*lue 5 django django-class-based-views django-rest-framework

使用 django 休息框架我试图创建一个允许检索和更新单个用户的视图,但我不明白如何做到这一点。目前我不关心权限和身份验证。

视图.py

class UserDetailsView(RetrieveUpdateAPIView):
    def get_object(self, user_id):
        user = get_user_model().objects.get(pk=user_id)
        return user
Run Code Online (Sandbox Code Playgroud)

urls.py

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

如果我尝试访问 localhost:8000/user/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'
Run Code Online (Sandbox Code Playgroud)

我错过了一些东西,因为使用基于函数的视图一切都工作得很好。例如:

视图.py

def game(request, id_game):
    # rest of code
Run Code Online (Sandbox Code Playgroud)

urls.py

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

Cor*_*den 4

首先,它是一个 kwarg 而不是 arg。有区别。因此,您需要user_id=Nonedef get()基于班级的视图中进行操作。您还可以通过访问 kwargs self.kwargs['user_id']

其次,由于您使用的是,RetrieveUpdateAPIView您只需添加 URL PK Kwarg 的属性,如下所示:

class UserDetailsView(RetrieveUpdateAPIView):
    lookup_url_kwarg = 'user_id'
Run Code Online (Sandbox Code Playgroud)

然后你不需要重写该get_object方法。有关此处属性的更多信息:https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview

请注意,我在这里链接到 GenericAPIView,因为它是RetrieveUpdateAPIView从(或其中一个类)继承的。