Django ModelForms:隐藏字段和强制默认值的最干净方法
假设我有一个模型表单,可以由不同层次的用户填写。管理员可以编辑该表单的任何字段;但对于其他用户,我需要预定义某些字段,并且是只读和/或隐藏的 使用我的CBV的Django ModelForms:隐藏字段和强制默认值的最干净方法,django,django-class-based-views,django-forms,Django,Django Class Based Views,Django Forms,假设我有一个模型表单,可以由不同层次的用户填写。管理员可以编辑该表单的任何字段;但对于其他用户,我需要预定义某些字段,并且是只读和/或隐藏的 使用我的CBV的get\u form\u kwargs方法,我已经让表单意识到正在使用它的用户,并且在它的\uuuu init\uuuuu方法中,我做出相应的反应,调整表单的排除,以及字段的必需和初始属性;然后,在我的视图的表单\u valid中,我进一步强制执行这些值。但是,坦率地说,我既不确定我做的每一个手术是否真的需要,也不确定是否有我不知道的漏洞
get\u form\u kwargs
方法,我已经让表单意识到正在使用它的用户,并且在它的\uuuu init\uuuuu
方法中,我做出相应的反应,调整表单的排除
,以及字段的必需
和初始
属性;然后,在我的视图的表单\u valid
中,我进一步强制执行这些值。但是,坦率地说,我既不确定我做的每一个手术是否真的需要,也不确定是否有我不知道的漏洞
那么,什么是最好、最干净的方法呢?假设没有太多的组合,我会创建一个不同的表单,以满足用户的不同需求。然后重写
def get_form_class
,并根据需要返回正确的表单。这将使不同的用例保持独立,并且如果您将来需要在不破坏其他表单的情况下进行更改,则可以提供灵活性
# models.py
class Foo(models.Model):
bar = model.CharField(max_length=100)
baz = model.CharField(max_length=100)
biz = model.CharField(max_length=100)
# forms.py
class FooForm(forms.ModelForm): # for admins
class Meta:
model = Foo
class FooForm(forms.ModelForm): # users who can't see bar
boo = forms.CharField()
class Meta:
model = Foo
exclude = ['bar']
class FooFormN(forms.ModelForm): # as many different scenarios as you need
def __init__(self, *args, **kwargs)
super(FooFormN, self).__init__(*args, **kwargs)
self.fields['biz'].widget.attrs['readonly'] = True
class Meta:
model = Foo
# views.py
class SomeView(UpdateView):
def get_form_class(self):
if self.request.user.groups.filter(name="some_group").exists():
return FooForm
# etc.
假设没有太多的组合,我会创建一个不同的表单来满足用户的不同需求。然后重写
def get_form_class
,并根据需要返回正确的表单。这将使不同的用例保持独立,并且如果您将来需要在不破坏其他表单的情况下进行更改,则可以提供灵活性
# models.py
class Foo(models.Model):
bar = model.CharField(max_length=100)
baz = model.CharField(max_length=100)
biz = model.CharField(max_length=100)
# forms.py
class FooForm(forms.ModelForm): # for admins
class Meta:
model = Foo
class FooForm(forms.ModelForm): # users who can't see bar
boo = forms.CharField()
class Meta:
model = Foo
exclude = ['bar']
class FooFormN(forms.ModelForm): # as many different scenarios as you need
def __init__(self, *args, **kwargs)
super(FooFormN, self).__init__(*args, **kwargs)
self.fields['biz'].widget.attrs['readonly'] = True
class Meta:
model = Foo
# views.py
class SomeView(UpdateView):
def get_form_class(self):
if self.request.user.groups.filter(name="some_group").exists():
return FooForm
# etc.
这是一种可能性。我曾经考虑过这个问题,但我没有意识到它确实有意义。这是一种可能性。我曾经考虑过这个问题,但我没有意识到它实际上是有意义的。