如何在视图中动态设置字段值?

时间:2012-05-18 08:41:04

标签: django

我有一个模型,说'文章',带字段

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())

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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对象传递给表单。

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