【发布时间】:2019-03-14 15:35:05
【问题描述】:
我正在向 Django 应用程序添加一些用户配置文件行为,并且像往常一样,我想限制用户只能与他们自己的数据进行交互。此 SO Q&A 与流程本身有关:
Django--- Allowing Users to only edit their profile
在创建、更新和删除查询中添加经过身份验证的用户 ID 就足够了吗?为了减少代码重复,我在想我可以编写一个 mixin 来覆盖 get_object 或 get_queryset 并通过添加 self.request.user.pk 来拦截查询以过滤结果?
还有其他有效的方法可以做到这一点,或者 Django 本身的 mixin 吗?
编辑这就是我的想法:
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
可能有更灵活的方法可以做到这一点,我愿意接受改进的建议。
【问题讨论】:
标签: django django-models django-views django-authentication