我向Django应用程序添加了一些用户配置文件行为,并且像往常一样,我想限制用户只能与自己的数据进行交互。这样的SO Q&A与流程本身有关:
Django--- Allowing Users to only edit their profile
将经过身份验证的用户ID添加到创建,更新和删除查询是否足够?为了减少代码重复,我当时想写一个可以覆盖get_object
或get_queryset
的mixin并通过添加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
可能有更灵活的方法可以做到这一点,我愿意提出改进建议。
答案 0 :(得分:1)
对于基于类的视图,您很可能需要重写get_querset()
方法,因为它返回的查询集将用于获取要编辑和删除的数据,因此返回类似MyModel.objects.filter(owner=self.request.user)
的内容。请注意,如果用户尝试访问不属于他的对象,这将导致404
-“未找到”响应。
在创建新对象时,您主要需要将request.user
设置为新创建对象的所有者。可以通过自定义CreateView
的{{1}}方法来实现:
form_valid()
根据您的模型结构,可以将此方法添加到mixin并将其与通用视图一起使用。