2012-05-13 18 views
8

Quiero crear un formulario SOLA que le da la capacidad de la administración para crear un nuevo usuario con perfil extendido. Tenga en cuenta que no quiero usar aplicaciones de administración y registro. He extendido el usuario con el modelo de perfil de usuario. He leído todos los documentos relacionados con la extensión del perfil de usuario. Pero, realmente no sé cómo guardar esta información. codifiqué el siguiente formulario de Django para este problema:Creación de un formulario de usuario Agregar en Django

class CreateUserForm(forms.Form): 
username = forms.CharField(max_length=30) 
first_name = forms.CharField() 
last_name = forms.CharField() 
password1=forms.CharField(max_length=30,widget=forms.PasswordInput()) #render_value=False 
password2=forms.CharField(max_length=30,widget=forms.PasswordInput()) 
email=forms.EmailField(required=False) 

title = forms.ChoiceField(choices=TITLE_CHOICES) 

def clean_username(self): # check if username dos not exist before 
    try: 
     User.objects.get(username=self.cleaned_data['username']) #get user from user model 
    except User.DoesNotExist : 
     return self.cleaned_data['username'] 

    raise forms.ValidationError("this user exist already") 


def clean(self): # check if password 1 and password2 match each other 
    if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:#check if both pass first validation 
     if self.cleaned_data['password1'] != self.cleaned_data['password2']: # check if they match each other 
      raise forms.ValidationError("passwords dont match each other") 

    return self.cleaned_data 


def save(self): # create new user 
    new_user=User.objects.create_user(username=self.cleaned_data['username'], 
            first_name=self.cleaned_data['first_name'], 
            last_name=self.cleaned_data['last_name'], 
            password=self.cleaned_data['password1'], 
            email=self.cleaned_data['email'], 
             ) 

    return new_user 

¿Está bien? sin embargo, me da un error en first_name y last_name. Django dice que no espera first_name y last_name en el método save().

+0

No estoy seguro de que tenga acceso al método 'save' a través de un formulario normal. Está disponible en la forma del modelo seguro https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method – super9

Respuesta

13

create_user solo admite los argumentos de nombre de usuario, correo electrónico y contraseña. Primero llame a create_user, luego agregue los valores adicionales al objeto guardado.

new_user=User.objects.create_user(self.cleaned_data['username'], 
            self.cleaned_data['email'], 
            self.cleaned_data['password1']) 
new_user.first_name = self.cleaned_data['first_name'] 
new_user.last_name = self.cleaned_data['last_name'] 
new_user.save() 
+0

Tienes razón. ¿Qué pasa con otros campos de perfil de usuario? ¿Tengo que guardarlos como campos de usuario? Por cierto, quiero asegurarme de haber elegido la solución adecuada para hacer esto. Entonces, ¿está bien? –

+6

Si se refiere a campos como 'empresa' y 'dirección', puede crear un modelo de perfil de usuario, que tiene una relación de uno a uno con el usuario (https://docs.djangoproject.com/en/dev/topics/auth/# auth-profiles). De esta forma, puede agregar tantos campos como desee y buscarlos con user.get_profile(). Company –

Cuestiones relacionadas