django-allauth — переопределение формы регистрации по умолчанию

Я использую этот код (в forms.py) для своей пользовательской формы регистрации для allauth:

class RegistrationForm(UserCreationForm):
    birth_date = forms.DateField(widget=extras.SelectDateWidget(years=BIRTH_DATE_YEARS))

    class Meta:
        model = get_user_model()
        fields = ('username', 'email', 'password1', 'password2', 'first_name', 'last_name', 'gender', 'birth_date', 'city', 'country')

Я, конечно, указал ACCOUNT_SIGNUP_FORM_CLASS в settings.py, чтобы указать на эту форму, и она отображает поля, которые я вставил в нее. Однако он не работает при отправке, даже если я использую метод signup, он никогда не вызывается. Я пробовал с save, но все равно то же самое - возникает ошибка, что одно из моих настраиваемых добавленных полей пусто при создании пользователя и сохранении его в базе данных. Итак, какой правильный код для достижения этого?


person softzer0    schedule 07.04.2016    source источник
comment
возможно, у вас отсутствует опция allauth в настройках вашего проекта! пожалуйста, посмотрите мой ответ и попробуйте адаптировать   -  person Mbambadev    schedule 08.04.2016
comment
У меня нет, как я сказал выше, я установил ACCOUNT_SIGNUP_FORM_CLASS, и форма отображается со всеми полями правильно. Проблема в его подаче.   -  person softzer0    schedule 08.04.2016


Ответы (2)


Я сделал это благодаря @rakwen, который нашел правильное решение здесь. Я написал свой собственный адаптер и поместил его в adapters.py в своем приложении:

from allauth.account.adapter import DefaultAccountAdapter

class AccountAdapter(DefaultAccountAdapter):
    def save_user(self, request, user, form, commit=False):
        data = form.cleaned_data
        user.username = data['username']
        user.email = data['email']
        user.first_name = data['first_name']
        user.last_name = data['last_name']
        user.gender = data['gender']
        user.birth_date = data['birth_date']
        user.city = data['city']
        user.country = data['country']
        if 'password1' in data:
            user.set_password(data['password1'])
        else:
            user.set_unusable_password()
        self.populate_username(request, user)
        if commit:
            user.save()
        return user

Затем я указал ACCOUNT_ADAPTER в settings.py, чтобы указать на этот адаптер, и он, наконец, начал работать!

person softzer0    schedule 08.04.2016

В вашем проекте settings.py попробуйте добавить эту строку:

проверьте, добавили ли вы это:

AUTHENTICATION_BACKENDS = (
    "django.contrib.auth.backends.ModelBackend",
    "allauth.account.auth_backends.AuthenticationBackend",
)

ACCOUNT_SIGNUP_FORM_CLASS = "yourapp.forms.customSignupForm"

В приложении.модели

class CustomModel(models.Model):
    """CustomModel docstring."""

    city = forms.CharField(max_length=75)
    country = forms.CharField(max_length=25)
    other....

В приложениях:

class SignForm(forms.ModelForm):
    """SignForm docstring."""

    username = forms.CharField(
        max_length=30,
    )
    first_name = forms.CharField(
        max_length=30,
    )
    last_name = forms.CharField(
        max_length=30,
    )
    field...

    def myclean():

    def signup(self, request, user):
        """You signup function."""


    # dont forget to save your model

    class Meta:
        model = mymodel.CustomModel
        fields = [
            'city',
            'country',
            'field...',
        ]

Попробуйте этот метод работы!

person Mbambadev    schedule 07.04.2016
comment
Вопрос: У вас есть пользовательские модели под названием User? - person Mbambadev; 08.04.2016
comment
Да, у меня есть пользовательская модель пользователя с моими дополнительными полями. - person softzer0; 08.04.2016
comment
если вы не создаете профиль или что-то подобное, эта модель должна иметь отношение oneToOne с пользователем django и добавлять ваши текущие другие поля. создайте модельную форму, а не простую форму. Смотри, я адаптирую свой ответ к твоему контексту. - person Mbambadev; 08.04.2016
comment
Перепробовал все, и все равно метод signup никогда не вызывается. Это больше похоже на проблему с самим allauth, а не с моим кодом. - person softzer0; 08.04.2016
comment
посмотри мой ответ и поставь лайк! - person Mbambadev; 08.04.2016
comment
обнови эту страницу и посмотри мой ответ еще раз! - person Mbambadev; 08.04.2016
comment
Я посмотрел на это, и я уже сделал и настроил то же самое - тот же код для forms.py находится в моем основном вопросе. Только myclean() там нет, так для чего этот метод, я не понимаю? - person softzer0; 08.04.2016
comment
Давайте продолжим это обсуждение в чате. - person Mbambadev; 08.04.2016
comment
ok. Итак, вы, ребята, перешли в чат, но оставили нас без ответа, задав вопрос, что делает dows myclean(). @rakwen не могли бы вы помочь здесь - person ronit; 20.07.2017
comment
Ронит Как дела? Я могу помочь вам ! - person Mbambadev; 26.12.2017