[英]How to restrict editing of records to record's owner in Django?
我知道这个问题已经在其他线程(例如this)中被询问/解决过。 但是,由于某种原因,建议的解决方案对我不起作用。
我创建了一个Django应用来管理实验室的菌株。 我的目标是仅允许在应变数据库中创建条目的用户或超级用户更改该条目。
我在models.py中有以下模型:
class strain (models.Model):
name = models.CharField("Name", max_length = 150, blank=False)
[...more fields here...]
user = models.ForeignKey(User)
def __unicode__(self):
return str(self.id)
以及admin.py中的以下内容:
class StrainAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'mating_type', 'parental_strain', 'user_id')
list_display_links = ('id', )
search_fields = ('id', 'name')
list_per_page = 25
list_filter = ('user', )
def get_form(self, request, *args, **kwargs):
form = super(StrainAdmin, self).get_form(request, *args, **kwargs)
form.base_fields['user'].initial = request.user
return form
def dispatch(self, request, *args, **kwargs):
handler = super(StrainAdmin, self).dispatch(request, *args, **kwargs)
if self.object.user_id != request.user:
return HttpResponseForbidden("Can't touch this.")
handler
从我在Stack Overflow(请参阅上文)和其他地方所读的文章中,我认为实现我的目标的最佳方法是扩展调度处理程序,如下所示:
def dispatch(self, request, *args, **kwargs):
handler = super(StrainAdmin, self).dispatch(request, *args, **kwargs)
if self.object.user_id != request.user:
return HttpResponseForbidden("Can't touch this.")
handler
但是,该解决方案似乎并没有做任何事情:用户仍然可以更改其记录和其他用户创建的记录。
我正在使用Django 1.9。 解决这个问题的最佳方法是什么?
先感谢您。
尼古拉
您对基于类的视图感到困惑; ModelAdmin不使用dispatch
方法。
在管理员中,最好的办法是覆盖has_change_permission
并检查obj.user_id
正如@ daniel-rosman所建议的,我已经能够解决上面提出的问题,如下所示
def has_change_permission(self, request, obj=None):
if obj is not None:
if request.user.is_superuser:
return True
else:
if obj.user != request.user:
return False
else:
return True
从某种意义上说,如果用户尝试访问另一个用户的记录,则他/她将获得403禁止页面。 然而,实现这种解决方案将阻止访问/变灰列表视图strain
(即示出了用于模型的记录表)。 对于超级用户也是如此! 这有点出乎意料的后果。
另外,我想知道是否存在允许用户查看记录但不能更改记录的另一种方法,除非他/她创建了该记录。 如果登录的用户与创建记录的用户不同,一种可能不是那么优雅的方法是在/change/
视图中隐藏“保存”按钮。 也许通过覆盖change_view
。 但是,从change_view
中获取对象(即应变)的属性似乎是不可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.