2012-01-15 29 views
7

Estoy usando django-userena. Tengo un modelo llamado UserProfile. He agregado campos adicionales en el formulario de registro. y Estos campos se muestran correctamente pero los datos no se guardan. Quiero guardar algunos datos de campos en otro modelo (Business) también. Por ejemplo, tengo dos campos como contact y business. Deseo que el campo de contacto vaya a UserProfile El modelo y el campo business va a Business Model. ¿Cualquier pista? Graciasagregando campos adicionales a los formularios django-userena

Aquí está mi código

class SignupFormExtra(SignupForm): 
    address = forms.CharField(label=_(u'Address'),max_length=30,required=False) 
    contact = forms.CharField(label=_(u'Contact'),max_length=30,required=False) 
    business = forms.CharField(label=_(u'Business Name'),max_length=30,required=False) 

    def save(self): 
     """ 
     Override the save method to save the first and last name to the user 
     field. 

     """ 

     user_profile = super(SignupFormExtra, self).save(commit=False) 

     user_profile.address = self.cleaned_data['address'] 
     user_profile.contact = self.cleaned_data['contact'] 
     user_profile.business = self.cleaned_data['business'] 

     user_profile.save() 

     return user_profile 

ACTUALIZACIÓN: estoy almacenando esos valores en una instancia de usuario ... Quiero punta de almacenarlos en el perfil de modelo - una instancia que está destinado al Usuario

+0

que han probado en el método de limpieza de la forma? – Ahsan

Respuesta

11

Autor de Userena aquí. Ya tenía una correspondencia por correo electrónico con "no_access", pero vale la pena señalar la solución si otros tienen el mismo problema. El primer error fue que el método save devuelve un perfil. Esto no es cierto, devuelve un Django User. Debido a esto, primero debe buscar el perfil y realizar los cambios en él. Guarde el perfil y luego devuelva al usuario de nuevo para mantenerlo compatible con Userena.

Para el modelo Business, solo agréguelo en el método save también.

class SignupFormExtra(SignupForm): 
    address = forms.CharField(label=_(u'Address'),max_length=30,required=False) 
    contact = forms.CharField(label=_(u'Contact'),max_length=30,required=False) 
    business = forms.CharField(label=_(u'Business Name'),max_length=30,required=False) 

    def save(self): 
     """ 
     Override the save method to save the first and last name to the user 
     field. 

     """ 
     # Original save method returns the user 
     user = super(SignupFormExtra, self).save() 

     # Get the profile, the `save` method above creates a profile for each 
     # user because it calls the manager method `create_user`. 
     # See: https://github.com/bread-and-pepper/django-userena/blob/master/userena/managers.py#L65 
     user_profile = user.get_profile() 

     # Be sure that you have validated these fields with `clean_` methods. 
     # Garbage in, garbage out. 
     user_profile.address = self.cleaned_data['address'] 
     user_profile.contact = self.cleaned_data['contact'] 
     user_profile.save() 

     # Business 
     business = self.cleaned_data['business'] 
     business = Business.objects.get_or_create(name=business) 
     business.save() 

     # Return the user, not the profile! 
     return user 

Después de crear el formulario, no olvide anular el formulario de uso en su urls.py. Algo como esto va a hacer:

url(r'^accounts/signup/$', 
     userena_views.signup, 
     {'signup_form': SignupFormExtra}), 

¡Eso debería hacer el truco! Buena suerte.

+0

Sí, recibí su correo electrónico. Gracias. ¿Podrías por favor verificar esto? Creo que [hay un error] http://stackoverflow.com/questions/8818435/many-to-many-field-added-to-the-profile-does-not-work-django-userena) – Kulbir

+2

¡Impresionante! Ahora todo lo que tiene que hacer es actualizar los documentos :) http://docs.django-userena.org/en/latest/faq.html#how-do-i-add-extra-fields-to-forms –

1

He intentado el truco anterior, y parece que funciona. Sin embargo, estoy corriendo hacia un error y nunca llego a la función de guardar en mi instalación. Tengo esta configuración en mi archivo de configuración: USERENA_WITHOUT_USERNAMES = Verdadero Por lo tanto, cuando subo el formulario para incluir nuevos campos, nunca llego al método guardar porque obtengo 'campo requerido', esto es para el campo que no soy usando (nombre de usuario).

que veo en la creación de la vista de la línea aquí: si userena_settings.USERENA_WITHOUT_USERNAMES y (signup_form == SignupForm): signup_form = SignupFormOnlyEmail lo tanto, me cambiaron el ejemplo a subclase el SignupFormOnlyEmail en lugar de la SignupForm y funciona. Por lo tanto, si usa USERENA_WITHOUT_USERNAMES, subclase un formulario diferente si desea cambiar el formulario de suscripción.

que se dan cuenta de esto no responde a esta pregunta (exactamente), pero, es un poco lo hace :-)

-g

Cuestiones relacionadas