get_object() 取决于 UpdateView 中的“request”
get_object() that depends on `request` in UpdateView
我正在编写一个基于 class 的视图,以允许用户编辑他们的个人资料。由于我希望用户使用 my_profile/edit/
类型的 URL 而不是 profile/<int:pk>/edit/
之类的东西来访问此视图,因此使用基于 UpdateView
的视图非常麻烦,因为获取用户配置文件对象需要访问 request
对象,而 get_object
不能直接访问它。
我的两个问题:
在这种情况下我可以使用 UpdateView
吗?
如果是这样,覆盖 get_object(self, queryset=None)
的最佳方法是什么?到目前为止,我最好的尝试如下:
class EditProfileView(UpdateView):
model = UserProfile
_request = None
def get_object(self, queryset=None):
return get_user_profile(self._request)
def dispatch(self, request, *args, **kwargs): # can also override setup() in newer Django versions
self._request = request
return super().dispatch(request, *args, **kwargs)
这对我来说看起来很干净,除了如果有一天 Django 框架决定 get_object
应该在视图生成的工作流程的早期调用,这段代码可能会中断。
您不需要这样做。所有基于 class 的视图都使请求可用 self.request
.
你的整个代码应该是:
class EditProfileView(UpdateView):
model = UserProfile
def get_object(self, queryset=None):
return get_user_profile(self.request)
请注意,即使没有,您仍然不需要在 class 级别定义 _request
。这在 Python.
中是没有必要的
另外,我不知道你的 get_user_profile
功能是做什么的,但它可能可以用 self.request.user.profile
.
代替
我正在编写一个基于 class 的视图,以允许用户编辑他们的个人资料。由于我希望用户使用 my_profile/edit/
类型的 URL 而不是 profile/<int:pk>/edit/
之类的东西来访问此视图,因此使用基于 UpdateView
的视图非常麻烦,因为获取用户配置文件对象需要访问 request
对象,而 get_object
不能直接访问它。
我的两个问题:
在这种情况下我可以使用
UpdateView
吗?如果是这样,覆盖
get_object(self, queryset=None)
的最佳方法是什么?到目前为止,我最好的尝试如下:class EditProfileView(UpdateView): model = UserProfile _request = None def get_object(self, queryset=None): return get_user_profile(self._request) def dispatch(self, request, *args, **kwargs): # can also override setup() in newer Django versions self._request = request return super().dispatch(request, *args, **kwargs)
这对我来说看起来很干净,除了如果有一天 Django 框架决定 get_object
应该在视图生成的工作流程的早期调用,这段代码可能会中断。
您不需要这样做。所有基于 class 的视图都使请求可用 self.request
.
你的整个代码应该是:
class EditProfileView(UpdateView):
model = UserProfile
def get_object(self, queryset=None):
return get_user_profile(self.request)
请注意,即使没有,您仍然不需要在 class 级别定义 _request
。这在 Python.
另外,我不知道你的 get_user_profile
功能是做什么的,但它可能可以用 self.request.user.profile
.