Python 基于状态的用户操作权限

Python 基于状态的用户操作权限,python,django,permissions,Python,Django,Permissions,我希望仅当状态为“插入”时才允许用户输入数据。单击“保存”按钮后,管理员将有时间验证数据,用户无法更改任何内容。实现此类权限的最佳方式是什么?视图中是否有任何位置,或者在加载页面时是否应根据状态冻结模板中的某些按钮?我还希望向用户提供一些错误消息,例如“您的数据已经保存” #models.py STATUS_CHOICES = ( ('i', 'inserting'), ('w', 'waiting'), ('a', 'accepted'), ('r', 're

我希望仅当状态为“插入”时才允许用户输入数据。单击“保存”按钮后,管理员将有时间验证数据,用户无法更改任何内容。实现此类权限的最佳方式是什么?视图中是否有任何位置,或者在加载页面时是否应根据状态冻结模板中的某些按钮?我还希望向用户提供一些错误消息,例如“您的数据已经保存”

#models.py

STATUS_CHOICES = (
    ('i', 'inserting'),
    ('w', 'waiting'),
    ('a', 'accepted'),
    ('r', 'rejected'),
)

class Trip(models.Model):
    user = models.ForeignKey(User)
    status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='i')

class Route(models.Model):
    trip = models.ForeignKey(Trip)
    from = models.CharField(max_length=255)
    to = models.CharField(max_length=255)

class Invoice(models.Model):
    trip = models.ForeignKey(Trip)
    description = models.TextField(blank=True)
    amount = models.DecimalField(max_digits=9, decimal_places=2)



#views.py

class ListView(generic.TemplateView):
    template_name = 'trip.html'

    def get_context_data(self, **kwargs):
        context = super(ListView, self).get_context_data(**kwargs)
        ...
        return context

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ListView, self).dispatch(*args, **kwargs)

这不是一个完美的解决方案,但它完成了任务。我必须为DeleteView覆盖delete(),为UpdateView和FormView覆盖form_valid()。我希望它不会损坏任何东西。不幸的是,它没有为用户提供良好的反馈

class DeleteView(edit.DeleteView):

    def delete(self, request, *args, **kwargs):
        if status == 'i':
            self.object.delete()
        return HttpResponseRedirect(self.get_success_url())



class FormView(edit.FormView):

    def form_valid(self, form):
        if status == 'i':
            data.save()
        return super(FormView, self).form_valid(form)

从你的描述中我看不出任何困难,听起来你已经知道你想要什么了。如果状态为“插入”,则显示该按钮;当状态为“保存”,则隐藏该按钮并显示一条消息,告知用户无法再编辑数据。您的问题是什么?@ShangWang我更愿意保留按钮,但当用户想要删除某些内容或以新表单插入对象时,我希望将其重定向到错误页面。如果要隐藏按钮(在我的现实例子中有很多),我需要第二个模板,我认为这不是一个干净的解决方案。我不知道你的页面是什么样子,但我想你的编辑视图需要一个入口点,比如点击一个按钮来编辑一个特定的项目,对吗?如果该项目(在您的案例中听起来像trip)的状态不是“插入”,您可以使用“
或其他内容来显示消息,让用户知道他们无法编辑该项目,而不是显示重定向到表单的按钮。这是一个用户体验问题,除非你向人们展示你的一些作品,否则很难回答你的问题。@ShangWang我想象一个解决方案,用户通过“插入”可以获取和发布方法,而不只是获取。可能吗?也许没有模板视图?