52 votos

Cómo personalizar el perfil de usuario al usar django-allauth

Tengo un proyecto de django con el django-allauth de la aplicación. Necesito recopilar datos adicionales del usuario al momento del registro. Me encontré con una pregunta similar aquí Cómo acceder a los nombres de usuario y los perfiles con django-allauth pero, por desgracia, nadie respondió a la personalización del perfil de la parte.

Por la documentación proporcionada por django-allauth

ACCOUNT_SIGNUP_FORM_CLASS (=None) Una cadena que apunta a un formulario personalizado de la clase (por ejemplo, 'myapp.los formularios.SignupForm') que se utiliza durante la suscripción a pedir al usuario para la entrada adicional (por ejemplo, suscribirse a un boletín informativo, fecha de nacimiento). Esta clase debe implementar un 'guardar' método, la aceptación de la recién firmada por el usuario, como su único parámetro.

Soy nuevo en django y estoy luchando con esto. Alguien puede dar un ejemplo de un formulario personalizado de la clase? Necesito agregar una clase del modelo, así como con un enlace para el objeto de usuario como este https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users ?

85voto

pennersr Puntos 2151

Supongamos que usted quiere preguntar al usuario por su nombre/apellido durante el registro. Necesitas poner estos campos en su propia forma, así:

class SignupForm(forms.Form):
    first_name = forms.CharField(max_length=30, label='Voornaam')
    last_name = forms.CharField(max_length=30, label='Achternaam')

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()

Luego, en su configuración punto a este formulario:

ACCOUNT_SIGNUP_FORM_CLASS = 'yourproject.yourapp.forms.SignupForm'

Eso es todo.

13voto

ferrangb Puntos 502

El uso de la solución sugerida por pennersr me estaba poniendo un DeprecationWarning:

DeprecationWarning: The custom signup form must offer a def signup(self, request, user) method DeprecationWarning)

Esto es debido a que a partir de la versión 0.15 el método save ha quedado obsoleto en favor de una def de inscripción(solicitud del usuario) método.

Así, para resolver esto, el código del ejemplo debería ser como este:

class SignupForm(forms.Form):
    first_name = forms.CharField(max_length=30, label='Voornaam')
    last_name = forms.CharField(max_length=30, label='Achternaam')

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()

-4voto

Jubin Thomas Puntos 737

Crear un Modelo de Perfil de usuario como OneToOneField

class Profile(models.Model):
    user = models.OneToOneField(User, verbose_name=_('user'), related_name='profiles')
    first_name=models.CharField(_("First Name"), max_length=150)
    last_name=models.CharField(_("Last Name"), max_length=150)
    mugshot = ImageField(_('mugshot'), upload_to = upload_to, blank=True)
    phone= models.CharField(_("Phone Number"), max_length=100)
    security_question = models.ForeignKey(SecurityQuestion, related_name='security_question')
    answer=models.CharField(_("Answer"), max_length=200)
    recovery_number= models.CharField(_("Recovery Mobile Number"), max_length=100)
    city=models.ForeignKey(City,related_name='city', blank=True, null=True, help_text=_('Select your City'))
    location=models.ForeignKey(Country,related_name='location', blank=True, null=True, help_text=_('Select your Location'))

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: