2012-01-15 21 views
7

Używam django-userena. Mam model o nazwie UserProfile. Dodałem dodatkowe pola w formularzu rejestracyjnym. i Te pola są wyświetlane poprawnie, ale dane nie są zapisywane. Chcę również zapisać dane niektórych pól w innym Modelu (Business). Na przykład mam dwa pola, takie jak contact i business. Chcę, aby pole kontaktowe trafiło do UserProfile Pole modelu i business zostanie zmienione na Business Model. jakaś wskazówka? Dziękujędodawanie dodatkowych pól do formularzy django-userena

Oto mój kod

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: Jestem przechowywania tych wartości, na przykład użytkownika ... Chcę toe przechowując je na modelu profilu - przypadek, który jest związany z Użytkownikiem

+0

czy to próbuje w czystej metody formularza? – Ahsan

Odpowiedz

11

Autor Userena tutaj. Miałem już korespondencję e-mail z "no_access", ale warto wskazać rozwiązanie, jeśli inni mają ten sam problem. Pierwszym błędem było to, że metoda save zwraca profil. To nie jest prawda, zwraca Django User. Z tego powodu najpierw musisz pobrać profil i wprowadzić w nim zmiany. Zapisz profil, a następnie ponownie zwróć użytkownika, aby był zgodny z Userena.

Dla modelu Business, dodaj również w metodzie 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 

Po utworzeniu formularza nie zapomnij zastąpić formularza userena w pliku urls.py. Coś takiego będzie:

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

To powinno wystarczyć! Powodzenia.

+0

Tak, mam twój adres e-mail. Dziękuję Ci. Czy możesz sprawdzić ten linK? Myślę, że [jest błąd] http://stackoverflow.com/questions/8818435/many-to-many-field-added-to-the-profile-does-not-work-django-userena) – Kulbir

+2

Awesome! Teraz wszystko, co musisz zrobić, to zaktualizować dokumenty :) http://docs.django-userena.org/en/latest/faq.html#how-do-i-add-extra-fields-to-forms –

1

Próbowałem powyższej sztuczki i wygląda na to, że działa. Jednak mam błąd i nigdy nie dostaję się do funkcji składowania w mojej instalacji. Mam to ustawienie w moim pliku ustawień: USERENA_WITHOUT_USERNAMES = True Tak więc, gdy uzupełniam formularz o nowe pola, nigdy nie dostanę metody zapisu, ponieważ otrzymam pole wymagane, dotyczy to pola, w którym nie jestem za pomocą (nazwa użytkownika).

widzę w tworzeniu widoku linia tutaj: jeśli userena_settings.USERENA_WITHOUT_USERNAMES i (signup_form == SignupForm): signup_form = SignupFormOnlyEmail Więc zmieniłem przykład do podklasy SignupFormOnlyEmail zamiast SignupForm i to działa. Tak więc, jeśli używasz USERENA_WITHOUT_USERNAMES, dodaj podklasę do innego formularza, jeśli chcesz zmienić formularz rejestracji.

Zdaję sobie sprawę, to nie jest odpowiedź na to pytanie (dokładnie), ale to trochę robi :-)

-g

Powiązane problemy