【问题标题】:Django Update/Delete view. Handling user permissionsDjango 更新/删除视图。处理用户权限
【发布时间】:2017-01-13 00:09:46
【问题描述】:

models.py

class Punch(models.Model):
ro_number = models.IntegerField()
flag = models.FloatField(max_length=10)
actual = models.FloatField(max_length=10)
description = models.CharField(max_length=100, blank=True)
user = models.ForeignKey(User)
created_on = models.DateTimeField(auto_now_add=True)

def efficiency(self):
    return '%.2f' % (float(self.flag)/float(self.actual)*100)

def __str__(self):
    return str(self.ro_number)

urls.py

url(r'^flags/update/(?P<pk>[0-9]+)/$', views.PunchEdit.as_view(), name='update_flags'),

view.py

class PunchEdit(views.LoginRequiredMixin,
            UpdateView,):
model = Punch
fields = ['ro_number', 'flag', 'actual', 'description']
template_name = 'free/home.html'

def get_success_url(self):
    pass

我试图弄清楚如何允许用户只编辑他们创建的打孔对象。每次创建 Punch 对象时,它都会使用外键关系保存哪个用户创建了该打孔。 (在未显示的视图中完成)

现在,如果您要输入诸如 mywebsite.com/punch/update/(pk)/ 之类的内容,用户可以写入任何打孔对象的 pk 并更新其信息。

所以我的问题是......当使用基于类的通用更新/删除视图时,如何防止用户触摸他们没有自己创建的打孔对象。

【问题讨论】:

    标签: django django-models django-views django-class-based-views django-generic-views


    【解决方案1】:

    您可以在.dispatch() 方法或.process_request() 中间件中检查用户,或者创建一个权限类以在您的视图中进行扩展。我会用第一个选项写一个简短的例子:

    class PunchEdit(...):
    
        def dispatch(self, request, *args, **kwargs):
            # check for user logged in
            ...
            # check for user permission:
            # Take pk from kwargs
            pk = kwargs.get('pk')  # example
            # Take user from request
            user = request.user
            # check permission
            try:
                Punch.objects.get(pk=pk, user=user)
                return super(PunchEdit, self).dispatch(request, *args, **kwargs)
            except Punch.DoesNotExist, e:
                return HttpResponseForbidden()
    

    HttpResponseForbidden()

    【讨论】:

    • stackoverflow 上的某个人建议我不要覆盖调度方法,而是要覆盖 get_object 或类似的东西。 @Gocht 你不知道吗?
    • @Lucas03 我给了他一些其他的选项来做这个,我认为在 dispatch 中检查用户权限更简单,我不认为这是一个很大的变化,实际上我称之为真正的 dispatch 方法一旦权限得到确认。
    猜你喜欢
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2013-07-06
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多