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我想象一个解决方案,用户通过“插入”可以获取和发布方法,而不只是获取。可能吗?也许没有模板视图?