带有 GET 参数的基于 Django class 的视图
Django class based view with GET parameters
我正在尝试使用 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"),
您可以在 get_object
中以 kwargs
的身份访问 user_id
。
def get_object(self):
user_id = self.kwargs['user_id']
...
基于 Class 的视图提供了更多的灵活性和代码重用,但您确实需要了解每个方法的含义以及调用时间。浏览 Django rest framework 的文档。
首先,它是一个 kwarg 而不是 arg。这是有区别的。因此,您需要在基于 class 的视图的 def get()
中执行 user_id=None
。您还可以通过 self.kwargs['user_id']
.
访问 kwargs
其次,由于您使用的是 RetrieveUpdateAPIView
,您可以像这样为 URL PK Kwarg 添加 属性:
class UserDetailsView(RetrieveUpdateAPIView):
lookup_url_kwarg = 'user_id'
然后你不需要覆盖 get_object
方法。
这里有一些关于属性的更多信息:https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview
请注意,我在此处链接到 GenericAPIView,因为那是 RetrieveUpdateAPIView
继承自(或 classes 之一)的东西。
您在 urlpatterns 中使用自定义关键字 user_id
。您需要在视图 class.
中设置 lookup_url_kwarg
此外,要充分利用通用视图的潜力,您应该设置 queryset
字段。如果这样做,则无需覆盖 get_object
方法。
class UserDetailsView(RetrieveUpdateAPIView):
queryset = get_user_model().objects.all()
lookup_url_kwarg = 'user_id'
...
我正在尝试使用 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"),
您可以在 get_object
中以 kwargs
的身份访问 user_id
。
def get_object(self):
user_id = self.kwargs['user_id']
...
基于 Class 的视图提供了更多的灵活性和代码重用,但您确实需要了解每个方法的含义以及调用时间。浏览 Django rest framework 的文档。
首先,它是一个 kwarg 而不是 arg。这是有区别的。因此,您需要在基于 class 的视图的 def get()
中执行 user_id=None
。您还可以通过 self.kwargs['user_id']
.
其次,由于您使用的是 RetrieveUpdateAPIView
,您可以像这样为 URL PK Kwarg 添加 属性:
class UserDetailsView(RetrieveUpdateAPIView):
lookup_url_kwarg = 'user_id'
然后你不需要覆盖 get_object
方法。
这里有一些关于属性的更多信息:https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview
请注意,我在此处链接到 GenericAPIView,因为那是 RetrieveUpdateAPIView
继承自(或 classes 之一)的东西。
您在 urlpatterns 中使用自定义关键字 user_id
。您需要在视图 class.
lookup_url_kwarg
此外,要充分利用通用视图的潜力,您应该设置 queryset
字段。如果这样做,则无需覆盖 get_object
方法。
class UserDetailsView(RetrieveUpdateAPIView):
queryset = get_user_model().objects.all()
lookup_url_kwarg = 'user_id'
...