2012-01-15 16 views
7

Sto usando django-userena. Ho un modello chiamato UserProfile. Ho aggiunto campi extra nel modulo di iscrizione. e Questi campi sono visualizzati correttamente ma i dati non vengono salvati. Voglio salvare alcuni dati dei campi in un altro modello (Business). Ad esempio, ho due campi come contact e business. Voglio campo di contatto andrà a UserProfile Modello e business campo andrà a Business Model. qualche indizio? Grazieaggiunta di campi aggiuntivi ai moduli django-userena

Ecco il mio codice

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 

UPDATE: Io sono la memorizzazione di quei valori su un'istanza utente ... voglio toe memorizzandoli sul modello di profilo - un'istanza che è destinato a all'Utente

+0

hai provato nel metodo pulito di forma? – Ahsan

risposta

11

Autore di Userena qui. Ho già avuto una corrispondenza e-mail con "no_access", ma vale la pena indicare la soluzione se altri hanno lo stesso problema. Il primo errore è stato che il metodo save restituisce un profilo. Questo non è vero, restituisce un Django User. Per questo motivo devi prima recuperare il profilo e apportare le modifiche ad esso. Salvare il profilo e quindi restituire l'utente nuovamente per renderlo compatibile con Userena.

Per il modello Business, è sufficiente aggiungerlo anche nel metodo save.

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 

Dopo aver creato il modulo, non dimenticate di sovrascrivere il modulo userena nella vostra urls.py. Qualcosa del genere farà:

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

Questo dovrebbe fare il trucco! In bocca al lupo.

+0

Sì, ho ricevuto la tua email. Grazie. Vuoi controllare questo linK? Penso che [c'è un bug] http://stackoverflow.com/questions/8818435/many-to-many-field-added-to-the-profile-does-not-work-django-userena) – Kulbir

+2

Fantastico! Ora tutto ciò che devi fare è aggiornare i documenti :) http://docs.django-userena.org/en/latest/faq.html#how-do-i-add-extra-fields-to-forms –

1

Ho provato il trucco di cui sopra, e sembra funzionare. Tuttavia, sto eseguendo un errore e non sono mai arrivato alla funzione di salvataggio nella mia installazione. Ho questa impostazione nel mio file delle impostazioni: USERENA_WITHOUT_USERNAMES = True Quindi, quando aggiungo il modulo per includere nuovi campi, non arrivo mai al metodo di salvataggio perché ottengo "campo obbligatorio", questo è per il campo che non sono utilizzando (nome utente).

vedo nella creazione della linea di vista qui: se userena_settings.USERENA_WITHOUT_USERNAMES e (signup_form == SignupForm): signup_form = SignupFormOnlyEmail Così, ho cambiato l'esempio per creare una sottoclasse del SignupFormOnlyEmail al posto del SignupForm e funziona. Pertanto, se utilizzi USERENA_WITHOUT_USERNAMES, sottoclassi un modulo diverso se desideri modificare il modulo di registrazione.

Mi rendo conto che non risponde a questa domanda (esattamente), ma, lo fa un pò :-)

-g

Problemi correlati