Django 只允许与用户数据交互
Django Allow Interaction with Users Data Only
我正在向 Django 应用程序添加一些用户配置文件行为,并且像往常一样我想限制用户只能与他们自己的数据进行交互。此 SO Q&A 与流程本身有关:
将经过身份验证的用户 ID 添加到创建、更新和删除查询中是否足够?为了减少代码重复,我想我可以编写一个 mixin 来覆盖 get_object
或 get_queryset
并通过添加 self.request.user.pk
来过滤结果来拦截查询?
是否有其他有效的方法来执行此操作,或者 Django 本身的 mixins?
编辑 这就是我的想法:
class OwnersDataOnlyViewMixin(object):
def get_object(self, queryset=None):
if self.model == get_user_model():
# user model, so pk of model should match self.request.user.pk
return super().get_object(self.model.objects.filter(pk=self.request.user.pk))
else:
# different model
try:
# check for the 'user' field and filter on it if found
user_field = self.model._meta.get_field('user')
return super().get_object(self.model.objects.filter(user=self.request.user))
except:
# Mixin was used with model data not associated with a user
raise self.model.DoesNotExist
可能有更灵活的方法来执行此操作,我愿意接受改进建议。
对于基于 class 的视图,您很可能需要重写 get_querset()
方法,因为由它 return 编辑的查询集将用于获取数据以进行编辑和删除,因此 return 类似于 MyModel.objects.filter(owner=self.request.user)
。请注意,如果用户试图访问不属于他的对象,这将导致 404
- "Not Found" 响应。
创建新对象时,您主要需要将 request.user
设置为新创建对象的所有者。这可以通过自定义 CreateView
的 form_valid()
方法来完成:
class MyCreateView(LoginRequiredMixin, generic.CreateView):
def form_valid(self, form):
form.instance.owner = self.request.user
return super().form_valid(form)
根据您的模型结构,您可以将此方法添加到 mixin 中并将它们与通用视图一起使用。
我正在向 Django 应用程序添加一些用户配置文件行为,并且像往常一样我想限制用户只能与他们自己的数据进行交互。此 SO Q&A 与流程本身有关:
将经过身份验证的用户 ID 添加到创建、更新和删除查询中是否足够?为了减少代码重复,我想我可以编写一个 mixin 来覆盖 get_object
或 get_queryset
并通过添加 self.request.user.pk
来过滤结果来拦截查询?
是否有其他有效的方法来执行此操作,或者 Django 本身的 mixins?
编辑 这就是我的想法:
class OwnersDataOnlyViewMixin(object):
def get_object(self, queryset=None):
if self.model == get_user_model():
# user model, so pk of model should match self.request.user.pk
return super().get_object(self.model.objects.filter(pk=self.request.user.pk))
else:
# different model
try:
# check for the 'user' field and filter on it if found
user_field = self.model._meta.get_field('user')
return super().get_object(self.model.objects.filter(user=self.request.user))
except:
# Mixin was used with model data not associated with a user
raise self.model.DoesNotExist
可能有更灵活的方法来执行此操作,我愿意接受改进建议。
对于基于 class 的视图,您很可能需要重写 get_querset()
方法,因为由它 return 编辑的查询集将用于获取数据以进行编辑和删除,因此 return 类似于 MyModel.objects.filter(owner=self.request.user)
。请注意,如果用户试图访问不属于他的对象,这将导致 404
- "Not Found" 响应。
创建新对象时,您主要需要将 request.user
设置为新创建对象的所有者。这可以通过自定义 CreateView
的 form_valid()
方法来完成:
class MyCreateView(LoginRequiredMixin, generic.CreateView):
def form_valid(self, form):
form.instance.owner = self.request.user
return super().form_valid(form)
根据您的模型结构,您可以将此方法添加到 mixin 中并将它们与通用视图一起使用。