добавление дополнительных полей в формы 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 7

2 ответа:

Автор 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}),

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

Я попробовал вышеприведенный трюк, и он, кажется, работает. Однако я выполняю ошибку и никогда не добираюсь до функции сохранения в моей установке. У меня есть этот параметр в файле настроек: USERENA_WITHOUT_USERNAMES=True Поэтому, когда я увеличиваю форму, чтобы включить новые поля, я никогда не получаю метод save, потому что я получаю 'Field required', это для поля, которое я не использую (имя пользователя).

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

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

- g