tengo un modelo extendido PerfilUsuario en Django:Creación de un perfil de usuario extendida
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
#other things in that profile
Y un signals.py:
from registration.signals import user_registered
from models import UserProfile
from django.contrib.auth.models import User
def createUserProfile(sender, instance, **kwargs):
profile = users.models.UserProfile()
profile.setUser(sender)
profile.save()
user_registered.connect(createUserProfile, sender=User)
que asegurarse de que la señal se registró por tener esto en mi __init__.py
:
import signals
Así que eso debería crearme un nuevo perfil de usuario para cada usuario que se registre, rig ¿ht? Pero no es así Siempre obtengo errores de "La coincidencia de perfil de usuario no existe" cuando intento iniciar sesión, lo que significa que la entrada de la base de datos no está allí.
Debo decir que uso django-registration, que proporciona la señal user_registered.
La estructura de las aplicaciones importantes para esto es que tengo una aplicación llamada "usuarios", allí tengo: models.py, signals.py, urls.py y views.py (y algunas otras cosas que no deberían tener) no importa aquí). La clase UserProfile se define en models.py.
actualización: Me cambió el signals.py a:
from django.db.models.signals import post_save
from models import UserProfile
from django.contrib.auth.models import User
def create_profile(sender, **kw):
user = kw["instance"]
if kw["created"]:
profile = UserProfile()
profile.user = user
profile.save()
post_save.connect(create_profile, sender=User)
Pero ahora me sale un "IntegrityError":
"user_id columna no es único"
Editar 2:
Lo encontré. Parece que de alguna manera registré la señal dos veces. La solución para esto se describe aquí: http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave
he tenido que añadir un dispatch_uid, ahora mi signals.py se parece a esto y está trabajando:
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from models import UserProfile
from django.db import models
def create_profile(sender, **kw):
user = kw["instance"]
if kw["created"]:
profile = UserProfile(user=user)
profile.save()
post_save.connect(create_profile, sender=User, dispatch_uid="users-profilecreation-signal")
Podría publicar la estructura de su aplicación Django. Tengo curiosidad acerca de un par de líneas en tu código como 'profile = user.models.UserProfile()' - ¿tienes un módulo llamado 'usuario'? Dónde se encuentra UserProfile(). – czarchaic
son usuarios, no sé cómo llegó ese error, pero el problema es el mismo. Me pregunto por qué Python no arrojó un error para la ruta mal escrita. – Kai
gracias por esta solución, soy nuevo con django, y no sé cómo ahorrar otros datos sobre el perfil del usuario. veo que solo guarde al usuario en el perfil UserProfile, pero ¿qué tan bueno guarde los datos de otros (utilizando su signals.py) desde el formulario de registro? Thansk (lo siento con el inglés) – Asinox