基于Django类的视图与GET参数

时间:2017-07-31 14:19:01

标签: django django-rest-framework django-class-based-views

使用django rest框架我试图创建一个允许检索和更新单个用户的视图但我不明白该怎么做。目前,我并不关心权限和身份验证。

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"),
]

如果我尝试访问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'

我遗漏了一些东西,因为基于函数的视图一切正常。例如:

views.py

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

urls.py

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

3 个答案:

答案 0 :(得分:2)

您可以user_id中的kwargs访问get_object

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

基于类的视图提供了更多的灵活性和代码重用,但您需要了解每个方法的含义以及调用的时间。浏览Django休息框架的文档。

答案 1 :(得分:2)

首先,它是一个不是arg的kwarg。有区别。因此,您需要在基于班级的视图的user_id=None中执行def get()。您也可以通过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继承了(或其中一个类)。

答案 2 :(得分: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'
    ...