добавление дополнительных полей в формы django-userena
Я использую django-userena
. У меня есть модель под названием UserProfile
. Я добавил дополнительные поля в форму регистрации. и эти поля отображаются правильно, но данные не сохраняются. Я также хочу сохранить некоторые данные полей в другой модели (Business
). Например, у меня есть два поля, такие как contact
и business
. Я хочу, чтобы поле контакта will шло к модели UserProfile
, а поле business
- к модели Business Model
. есть зацепка? Спасибо
Вот мой код
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: я сохраняю эти значения в экземпляре пользователя... Я хочу сохранить носок. them on Profile model-экземпляр, привязанный к пользователю
2 ответа:
Автор Userena здесь. У меня уже была электронная переписка с "no_access", но стоит указать на решение, если у других есть такая же проблема. Первая ошибка заключалась в том, что метод
save
возвращает профиль. Это не так, он возвращает DjangoUser
. Из-за этого вы сначала должны получить профиль и внести в него изменения. Сохраните профиль, а затем снова верните пользователя, чтобы он был совместим с 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}),
Это должно сработать! Удачи.
Я попробовал вышеприведенный трюк, и он, кажется, работает. Однако я выполняю ошибку и никогда не добираюсь до функции сохранения в моей установке. У меня есть этот параметр в файле настроек: USERENA_WITHOUT_USERNAMES=True Поэтому, когда я увеличиваю форму, чтобы включить новые поля, я никогда не получаю метод save, потому что я получаю 'Field required', это для поля, которое я не использую (имя пользователя).
Я вижу в создании вида линию здесь: если userena_settings.USERENA_WITHOUT_USERNAMES and (signup_form = = форма регистрации): signup_form = SignupFormOnlyEmail Поэтому я изменил пример на подкласс SignupFormOnlyEmail вместо SignupForm, и это работает. Таким образом, если вы используете USERENA_WITHOUT_USERNAMES, подкласс другой формы, если вы хотите изменить форму регистрации.
Я понимаю, что это не ответ на этот вопрос (точно), но, это своего рода делает : -)
- g