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

Във вашия проект setting.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....

В app.forms:

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
ако не създадете профил или друг подобен, този модел трябва да има връзка един към един с потребителя на 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
добре, така че вие, момчета, се преместихте в чат, но оставихте всички без отговор с i que..какво прави dows myclean(). @rakwen може ли да помогнеш тук - person ronit; 20.07.2017
comment
Ронит Как си? Мога да ти помогна ! - person Mbambadev; 26.12.2017