如果用户不是is_staff / is_superuser,那么一直试图确定从一个字段中删除字段的“最”优雅解决方案。找到一个有效的代码。最初我想在'exclude'元素中添加'close'或者使用两种不同的形式。但这似乎记录了正在发生的事情。逻辑在'views.py'中,这是我觉得它的地方。
我的问题:这样安全吗?我没有看到以这种方式操纵的形式,它有效。
models.py
class Update(models.Model):
denial = models.ForeignKey(Denial)
user = models.ForeignKey(User)
action = models.CharField(max_length=1, choices=ACTION_CHOICES)
notes = models.TextField(blank=True, null=True)
timestamp = models.DateTimeField(default=datetime.datetime.utcnow().replace(tzinfo=utc))
close = models.BooleanField(default=False)
forms.py
class UpdateForm(ModelForm):
class Meta:
model = Update
exclude = ['user', 'timestamp', 'denial', ]
views.py
class UpdateView(CreateView):
model = Update
form_class = UpdateForm
success_url = '/denials/'
template_name = 'denials/update_detail.html'
def get_form(self, form_class):
form = super(UpdateView, self).get_form(form_class)
if not self.request.user.is_staff:
form.fields.pop('close') # ordinary users cannot close tickets.
return form
答案 0 :(得分:1)
是的,您的方法完全有效。 FormMixin的设计使您可以覆盖与在视图中管理表单相关的方法,并且可以直接进行测试。
但是,如果您或其他人对结果表单对象的动态修改变得过于广泛,最好定义几个表单类并使用get_form_class()
选择正确的表单类来实例化表单对象