我有以下表格和继承表格:
class UsuarioAdminForm(ModelForm):
first_name = forms.CharField(label='Nombre', help_text = 'Nombre del usuario', required=True)
last_name = forms.CharField(label='Apellidos', help_text = 'Apellidos del usuario', required=True)
dni = ESIdentityCardNumberField(help_text = 'DNI del usuario', required=True, widget = forms.TextInput(attrs = {'size': 9}))
username = forms.CharField(label='Login', help_text = 'Requerido. 30 caracteres o menos. Letras, números y @/./+/-/_', widget = forms.TextInput(attrs = {'size': 15}))
#password = forms.CharField(widget=forms.PasswordInput(attrs = {'size': 12}), label='Contraseña', help_text = 'Contraseña del usuario')
email = forms.EmailField(help_text = 'Correo electrónico del usuario', required=True)
movil = ESPhoneNumberField(help_text = 'Movil principal del usuario', required=True, widget = forms.TextInput(attrs = {'size': 9 }))
is_staff = forms.BooleanField(label = "Administrador", help_text = 'Marque la casilla si desea crear un administrador')
tipo_u = forms.ChoiceField(label = 'Tipo de usuario', choices = TipoUsuarios)
def clean(self):
try:
cleaned_data = self.cleaned_data
movil = self.cleaned_data['movil']
dni = self.cleaned_data['dni']
email = self.cleaned_data['email']
except:
raise forms.ValidationError(u'Todos los campos del Formulario son Obligatorios.')
return cleaned_data
class Meta:
model = Usuario
exclude = ('is_active','date_joined', 'last_login', 'user_permissions', 'tipo', 'groups', 'is_superuser', )
class UsuarioForm(UsuarioAdminForm):
is_staff = None
def __init__(self, *args, **kwargs):
self.is_staff = None
super(UsuarioForm,self).__init__(*args, **kwargs)
class Meta:
model = Usuario
exclude = ('is_staff', 'is_active','date_joined', 'last_login', 'user_permissions', 'tipo', 'groups', 'is_superuser', 'password', )
但是当我创建一个UsuarioForm对象时,它为什么会显示is_staff字段?
更新:
如果我放self.fields['is_staff'] = None
我获得下一个错误:
TemplateSyntaxError at / SMS / USUARIOS /添加/用户/
渲染时捕获AttributeError: 'NoneType'对象没有属性 '标签'
答案 0 :(得分:9)
也许你可以改变这一行的顺序:
def __init__(self, *args, **kwargs):
super(UsuarioForm,self).__init__(*args, **kwargs)
self.is_staff = None
你也可以这样做:
def __init__(self, *args, **kwargs):
super(UsuarioForm,self).__init__(*args, **kwargs)
self.fields.pop('is_staff')
答案 1 :(得分:0)
这是一个老问题,但是从Django 1.7.x开始,您可以执行以下操作:
class UsuarioForm(UsuarioAdminForm):
is_staff = None
class Meta:
model = Usuario
exclude = ('is_active', 'date_joined', 'last_login', 'user_permissions', 'tipo', 'groups', 'is_superuser', 'password')
exclude
的{{1}}部分仅用于排除Meta
元素,但可以通过在声明中将ModelForm
设置为None
来排除任何表单元素。
来自Django docs on subclassing forms:
可以声明性地删除从父级继承的Field class通过在子类上将字段名称设置为None。对于 例如:
>>> from django import forms >>> class ParentForm(forms.Form): ... name = forms.CharField() ... age = forms.IntegerField() >>> class ChildForm(ParentForm): ... name = None >>> ChildForm().fields.keys() ... ['age']
修改强>:
我认为上述内容适用于给出的示例,但它似乎不适用于由于Meta
上的ModelForm
而创建的字段。我认为在这些情况下,您需要从父Meta
继承并更改给定的字段。
答案 2 :(得分:-1)
Django表单实例将字段存储在表单本身的“fields”属性中,因此在 init 中,在调用super之后,您需要以下内容:
self.fields['is_staff'] = None
那应该可以解决你的问题;设置self.is_staff只是一个不相关的变量(你在类上设置的is_staff是一个类变量而不是一个实例变量)。