5

Tengo dos modelos en Django: User (predefinido por Django) y UserProfile. Los dos están conectados a través de una clave externa.Cómo crear una vista que guarda los objetos de User y UserProfile en Django

models.py:

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True, related_name="connect") 
    location = models.CharField(max_length=20, blank=True, null=True) 

estoy usando UserCreationForm (pre-definido por Django) para el modelo de usuario, y creó otra forma de PerfilUsuario en forms.py

#UserCreationForm for User Model 

class UserProfileForm(ModelForm): 
    class Meta: 
    model = UserProfile 
    exclude = ("user",) 

I cargue ambos formularios en una plantilla, registration.html, para que el cliente del sitio web pueda ingresar datos sobre los campos contenidos en ambos modelos (por ejemplo: "first_name", "last_name" en el modelo de usuario, "location" en el modelo UserProfile).

Por mi vida, no puedo encontrar la manera de crear una vista para este formulario de registro. Lo que he intentado hasta ahora creará el objeto User, pero no asociará otra información, como la ubicación en el objeto UserProfile correspondiente. ¿Puede alguien ayudarme? Esto es lo que tengo actualmente:

def register(request): 
    if request.method == 'POST': 
    form1 = UserCreationForm(request.POST) 
    form2 = UserProfileForm(request.POST) 
    if form1.is_valid(): 
     #create initial entry for User object 
     username = form1.cleaned_data["username"] 
     password = form1.cleaned_data["password"] 
     new_user = User.objects.create_user(username, password) 

     # What to do here to save "location" field in a UserProfile 
     # object that corresponds with the new_user User object that 
     # we just created in the previous lines 

    else: 
    form1 = UserCreationForm() 
    form2 = UserProfileForm() 
    c = { 
    'form1':UserCreationForm, 
    'form2':form2, 
    } 
    c.update(csrf(request)) 
    return render_to_response("registration/register.html", c) 
+0

http://stackoverflow.com/questions/569468/django-multiple-models-in-one-template-using-forms –

Respuesta

3

Casi allí :)

def register(request): 
    if request.method == 'POST': 
     form1 = UserCreationForm(request.POST) 
     form2 = UserProfileForm(request.POST) 
     if form1.is_valid() and form2.is_valid(): 
      user = form1.save() # save user to db 
      userprofile = form2.save(commit=False) # create profile but don't save to db 
      userprofile.user = user 
      userprofile.location = get_the_location_somehow() 
      userprofile.save() # save profile to db 

    else: 
     form1 = UserCreationForm() 
     form2 = UserProfileForm() 
    c = { 
     'form1':form1, 
     'form2':form2, 
    } 
    c.update(csrf(request)) 
    return render_to_response("registration/register.html", c) 

Para aclarar un poco, form.save() crea una instancia del modelo y lo guarda en dB. form.save(commit=False) Simplemente crea una instancia, pero no guarda nada en db.

Cuestiones relacionadas