我有一个模型,说'文章',带字段
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())
假设我从模板中删除了这个隐藏字段。
答案 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对象传递给表单。
警告:未经测试的伪代码。但这应该会给你一个想法。