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

スタッフ用と一般ユーザー用の 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 に答える