Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Extender modelo de usuarios

Estas en el tema de Extender modelo de usuarios en el foro de Python en Foros del Web. Necesito añadir unos campos extra para los usuarios que se registren en mi aplicación, por lo que he creado un modelo 'Profiles' relacionado con su ...
  #1 (permalink)  
Antiguo 24/08/2014, 08:21
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 11 años, 5 meses
Puntos: 1
Extender modelo de usuarios

Necesito añadir unos campos extra para los usuarios que se registren en mi aplicación, por lo que he creado un modelo 'Profiles' relacionado con su tupla en la tabla User:

Código Python:
Ver original
  1. from django.contrib.auth.models import User
  2.  
  3.  
  4. class Profiles(models.Model):
  5.     user = models.OneToOneField(User)
  6.     url = models.URLField()
  7.     avatar = models.ImageField(upload_to='profile_avatar')
  8.  
  9.     def __str__(self):
  10.         return self.user.username

Después he creado un formulario que pida el email, url y avatar en un fichero 'forms.py':

Código Python:
Ver original
  1. from django import forms
  2. from django.contrib.auth.forms import UserCreationForm
  3.  
  4.  
  5. class UserForm(UserCreationForm):
  6.     email = forms.EmailField()
  7.     url = forms.URLField()
  8.     avatar = forms.ImageField()

Por último defino la clase SignIn que toma los valores del formulario y crea un usuario relacionado con el modelo Profiles:

Código Python:
Ver original
  1. from django.views.generic import FormView
  2. from .forms import UserForm
  3. from django.core.urlresolvers import reverse_lazy
  4. from .models import Profiles
  5. from django.contrib.auth.models import User
  6.  
  7.  
  8. class SignIn(FormView):
  9.     template_name = 'index/signin.html'
  10.     form_class = UserForm
  11.     success_url = reverse_lazy('signin')
  12.  
  13.     def form_valid(self, form):
  14.         user = form.save()
  15.         u = User.objects.get(username=str(user))
  16.         u.email = form.cleaned_data['email']
  17.         profile = Profiles()
  18.         profile.user = user
  19.         profile.url = form.cleaned_data['url']
  20.         profile.avatar = form.cleaned_data['avatar']
  21.         profile.save()
  22.         return super(SignIn, self).form_valid(form)

Al ingresar los datos en el formulario sale el siguiente error: (1062, "Duplicate entry '' for key 'mail'")

Si elimino estas líneas de la vista, todo se crea correctamente pero no se asigna el campo email:
u = User.objects.get(username=str(user))
u.email = form.cleaned_data['email']

¿Cómo puedo ingresar el valor de "email" en el modelo User?

Gracias
  #2 (permalink)  
Antiguo 25/08/2014, 21:09
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Extender modelo de usuarios

Es porque no entiendes muchas cosas de Python + Django.

Vamos a examinar linea por linea.

Código Python:
Ver original
  1. user = form.save()
Ok, guardas el usuario. Pero esto tiene consecuencias. Al momento de salvarlo el usuario ya esta en la base de datos

Código Python:
Ver original
  1. u = User.objects.get(username=str(user))
WTF, acabas de guardar el usuario y ya tienes una referencia en la variable user. ¿Porque lo vuelves a obtener de la base de datos?

Código Python:
Ver original
  1. u.email = form.cleaned_data['email']
Estoy muy seguro que esto ya lo hace el form.

Código Python:
Ver original
  1. profile = Profiles()
  2. profile.user = user
  3. profile.url = form.cleaned_data['url']
  4. profile.avatar = form.cleaned_data['avatar']
  5. profile.save()
Esta es la parte buena.

Código Python:
Ver original
  1. return super(SignIn, self).form_valid(form)
Recuerdas el form.save() de alla arriba? Y recuerdas que la parte del email te dije que ya lo hacia el form? Pues sorpresa! cuando ejecutas form_valid. Trata de crear otro usuario, cosa que ya te adelantaste a hacer. Y cual es el resultado? Que ese email ya existe en la db. Y por eso te marca el error de email duplicado.

¿Entonces que debo de hacer?
Lo que debiste de hacer fue: hacer un override del metodo save del formulario. Usar el nuevo usuario que te genera para crear ahora si una instancia de Profile y guardarlo.

Aquí hay un ejemplo: http://stackoverflow.com/questions/5...tionform-basic
  #3 (permalink)  
Antiguo 26/08/2014, 05:11
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: Extender modelo de usuarios

Muchas gracias

Después de eliminar las redundancias y crear el override, todo funciona correctamente

Nunca pensé que mi primera aplicación me fuese a aportar tanto... , cuando la termine tendré que hacer una maratón de lectura de libros sobre python, jajaja

Saludos!

Etiquetas: django, usuario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:40.