0

我有一个模型,比如“文章”,有一个字段

published = models.BooleanField(default=True)

和一个带有条件的模板:

{% if user.is_staff %}
    <li>form.published.label_tag</li>
    <li>form.published</li>
{% else %}
    <li>form.published.as_hidden</li>
{% endif %}

我使用基于类的通用视图来添加和更新这个模型。

在这种情况下,普通编外和恶意用户仍然可以替换published字段的值。

我认为我必须将条件移至视图级别以防止此问题,例如

class ArticleEdit(UpdateView):
    model = Article
    form_class = ArticleForm

    def form_valid(self, form):
        self.object = form.save(commit=False)
        if self.request.user.is_staff:

            ''' How to let the staff change this value? '''

        else:

            ''' How to set previous value? '''

        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

假设我从模板中删除了这个隐藏字段。

4

2 回答 2

2

我会考虑定义两种形式,一种用于员工,一种用于普通用户。然后,您可以覆盖该get_form_class方法以选择正确的表单。如果您published从非员工表单中排除该字段,那么他们将无法更改该值。

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        exclude = ('published',)


class ArticleStaffForm(ArticleForm)
    class Meta:
        model = Article
        exclude = ()

class ArticleEdit(UpdateView):
    ...
    def get_form_class(self):
        if self.request.user.is_staff:
            return ArticleStaffForm
        else:
            return ArticleForm
于 2012-05-18T09:43:52.173 回答
0

您可以执行以下操作:

class MyForm(forms.Form):
    def __init__(self, user, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        if not user.is_staff:
            del self.fields['published']

然后在初始化时将 request.user 对象传递给表单。

警告:未经测试的伪代码。但这应该给你一个想法。

于 2012-05-18T08:57:53.420 回答