2012-01-15 1 views
7

Я использую django-userena. У меня есть модель под названием UserProfile. Я добавил дополнительные поля в регистрационную форму. Эти поля отображаются правильно, но данные не сохраняются. Я хочу сохранить некоторые данные полей в другую модель (Business). Например, у меня есть два поля, например contact и business. Я хочу, чтобы контактное поле пошло на UserProfile. Модель и business поле отправится в Business Model. любой ключ? Спасибодобавление дополнительных полей в формы django-userena

Вот мой код

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: Я храню эти значения на экземпляре пользователя ... Я хочу, чтобы палец хранить их на модели профиля - экземпляр, который привязан к пользователю

+0

вы пробовали его в чистом методе формы в? – Ahsan

ответ

11

Автор Userena здесь. У меня уже была переписка по электронной почте с «no_access», но стоит обратить внимание на решение, если у других такая же проблема. Первая ошибка заключалась в том, что метод save возвращает профиль. Это неверно, он возвращает Django User. Из-за этого вам сначала нужно получить профиль и внести в него изменения. Сохраните профиль и снова верните пользователя, чтобы он совместим с Userena.

Для модели Business просто добавьте ее в 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 

После создания формы не забудьте переопределить форму userena в urls.py. Что-то вроде этого будет делать:

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

Это должно сделать трюк! Удачи.

+0

Да, я получил ваш адрес электронной почты. Спасибо. Вы проверите этот linK? Я думаю [есть ошибка] http://stackoverflow.com/questions/8818435/many-to-many-field-added-to-the-profile-does-not-work-django-userena) – Kulbir

+2

Удивительный! Теперь все, что вам нужно сделать, это обновить документы: http://docs.django-userena.org/en/latest/faq.html#how-do-idad-extra-fields-to-forms –

1

Я пробовал вышеупомянутый трюк, и он действительно работает. Тем не менее, я запускаю ошибку и никогда не получаю функцию сохранения в моей установке. У меня есть этот параметр в моем файле настроек: USERENA_WITHOUT_USERNAMES = True Итак, когда я добавляю форму для включения новых полей, я никогда не получаю метод сохранения, потому что получаю «поле обязательное», это для поля, которое я не используя (имя пользователя).

я вижу в создании вида линия здесь: если userena_settings.USERENA_WITHOUT_USERNAMES и (signup_form == SignupForm): signup_form = SignupFormOnlyEmail Итак, я изменил пример подкласса SignupFormOnlyEmail вместо SignupForm и она работает. Итак, если вы используете USERENA_WITHOUT_USERNAMES, подкласс имеет другую форму, если вы хотите изменить форму регистрации.

Я понимаю, что это не отвечает на этот вопрос (точно), но это своего рода делает :-)

-g

 Смежные вопросы

  • Нет связанных вопросов^_^