2012-08-13 18 views
8

Tengo dos modelos en Django: Usuario (predefinido por Django) y Perfil de usuario. Los dos están conectados a través de una clave externa. Estoy creando un formulario que permite a un cliente editar su perfil de usuario. Como tal, este formulario se basará en los dos modelos mencionados.¿Cómo se escribe un método para guardar formularios en django?

¿Cómo creo un método save() para este formulario? ¿Cuáles son los pasos/requisitos para completar la función de guardar?

Esto es lo que tengo hasta ahora en forms.py:

class UserChangeForm(forms.Form): 
    #fields corresponding to User Model 
    email = forms.EmailField(required=True) 
    first_name = forms.CharField(max_length = 30) 
    last_name = forms.CharField(max_length = 30) 
    password1 = forms.CharField(max_length=30, widget=forms.PasswordInput) 
    password2 = forms.CharField(max_length=30, widget=forms.PasswordInput) 

    #fields corresponding to UserProfile Model 
    gender = forms.CharField(max_length = 30, widget=forms.Select) 
    year = forms.CharField(max_length = 30, widget=forms.Select) 
    location = forms.CharField(max_length = 30, widget=forms.Select) 

    class Meta: 
     fields = ("username", "email", "password1", "password2", "location", "gender", "year", "first_name", "last_name") 

    def save(self): 
     data = self.cleaned_data 
     # What to do next over here? 

¿Es esta una buena salida o Alguien puede recomendar gustaría cambiar esto antes de empezar a escribir la función de guardar()?

+0

Por qué no usar 'ModelForm's? –

+2

¿Puedo crear un ModelForm basado en dos modelos? Si es así, ¿cómo voy a hacer eso? – goelv

Respuesta

3

El argumento prefix (también en ModelForm por herencia) al constructor le permitirá poner múltiples formularios dentro de una única etiqueta <form> y distinguirlos en el envío.

mf1 = ModelForm1(prefix="mf1") 
mf2 = ModelForm2(prefix="mf2") 
return render_to_response(..., {'modelform1': mf1, 'modelform2': mf2}, ...) 

...

<form method="post"> 
{{ modelform1 }} 
{{ modelform2 }} 
... 
</form> 
8

Esto podría ayudarle a

def save(self): 
    data = self.cleaned_data 
    user = User(email=data['email'], first_name=data['first_name'], 
     last_name=data['last_name'], password1=data['password1'], 
     password2=data['password2']) 
    user.save() 
    userProfile = UserProfile(user=user,gender=data['genger'], 
     year=data['year'], location=data['location']) 
    userProfile.save() 
+0

Solo para aclarar/aprender, ¿cuál es el propósito de guardar los datos como instancias de los modelos? Es eso lo que hace cada forma, y ​​si es así ¿por qué es eso? – goelv

+5

Solo las formas basadas en "ModelForm" tienen un método guardado. Para formularios basados ​​en "Formulario", debe crear un método de guardado. [ModelForms] (https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/#the-save-method) – alexander

Cuestiones relacionadas