django cbv基于is_staff / is_superuser动态排除表单中的字段

时间:2013-12-30 19:14:59

标签: django forms django-class-based-views

如果用户不是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

1 个答案:

答案 0 :(得分:1)

是的,您的方法完全有效。 FormMixin的设计使您可以覆盖与在视图中管理表单相关的方法,并且可以直接进行测试。

但是,如果您或其他人对结果表单对象的动态修改变得过于广泛,最好定义几个表单类并使用get_form_class()选择正确的表单类来实例化表单对象