usercreationform - Excluir nombre de usuario o contraseña de UserChangeForm en Django Auth
request.user django (2)
No podrá hacer esto si usa UserChangeForm
.
Vea esto https://github.com/django/django/blob/master/django/contrib/auth/forms.py .
Notará que UserChangeForm
en esta página define explícitamente el username
y la password
. Estos campos están presentes en la variable declared_fields
en el formulario.
exclude
y los fields
solo funcionan en campos tomados del model
definido en Meta
. Si define explícitamente un campo, es decir, declared_fields
, estarán presentes en el formulario incluso si se han excluido mediante exclude
. Entonces, estos campos se muestran para usted.
Para leer más sobre este cheque __new__
de ModelFormMetaclass
en https://github.com/django/django/blob/master/django/forms/models.py
Solución:
No use UserChangeForm y lea su código. No te proporciona mucho. Puede escribir su propio formulario que solo se extiende desde ModelForm
y establecer Meta Model
como usuario. Copie las partes de UserChangeForm
en su formulario.
class UserForm(forms.ModelForm):
class Meta:
model = User
def __init__(self, *args, **kwargs):
#copy any functionality you want form UserChangeForm
def clean_password(self):
#copy functionality provided by UserChangeForm
Estoy tratando de encontrar la manera de excluir el nombre de usuario y / o la contraseña de UserChangeForm
. Intenté exclude
y fields
pero no trabajo para estos dos campos.
Aquí hay un código:
class ArtistForm(ModelForm):
class Meta:
model = Artist
exclude = (''user'',)
class UserForm(UserChangeForm):
class Meta:
model = User
fields = (
''first_name'',
''last_name'',
''email'',
)
exclude = (''username'',''password'',)
def __init__(self, *args, **kwargs):
self.helper = FormHelper
self.helper.form_tag = False
super(UserForm, self).__init__(*args, **kwargs)
artist_kwargs = kwargs.copy()
if kwargs.has_key(''instance''):
self.artist = kwargs[''instance''].artist
artist_kwargs[''instance''] = self.artist
self.artist_form = ArtistForm(*args, **artist_kwargs)
self.fields.update(self.artist_form.fields)
self.initial.update(self.artist_form.initial)
def clean(self):
cleaned_data = super(UserForm, self).clean()
self.errors.update(self.artist_form.errors)
return cleaned_data
def save(self, commit=True):
self.artist_form.save(commit)
return super(UserForm, self).save(commit)
Creo que puede ser útil ...
mientras iteras sobre el campo de formulario en la plantilla, escribe
if for field in UserChangeFormObject:
{% ifnotequal field.lable password %}
#process your form field here
{% endifnotequal%}
Lea más aquí https://docs.djangoproject.com/en/1.6/releases/1.2/