Как использовать django-allauth с пользовательской моделью пользователя в Django?

Вот моя модель пользователя:

class UserManager(BaseUserManager):
    """Manager for CustomUser."""
    def build_user(self, email, password=None, **extra_fields):
        """Instantiate and return a regular user with an email and password."""
        if not email:
            raise ValueError(_('The Email field must be set'))
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def build_superuser(self, email, password, **extra_fields):
        """Instantiate and return a superuser with an email and password."""
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        return self.create_user(email, password, **extra_fields)



class User(AbstractUser):
    """CustomUser model"""
    email = models.EmailField(_('email address'), unique=True, blank=False, null=False)
    username = models.CharField(_('profile name'), max_length=150, unique=False,  blank=False, null=False)
    gender = models.IntegerField(_('gender'), choices=Gender.choices, blank=True, null=True)
    birth_date = models.DateField(_('birth date'), blank=True, null=True)
    country = CountryField(blank_label='(select country)',  blank=True, null=True)
    is_admin = models.BooleanField(default=False,  blank=True, null=True)
    online_status = models.BooleanField(default=False, blank=True, null=True)  # True for online, False for offline

    USERNAME_FIELD = 'email'  # Use email to log in
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'gender', 'birth_date', 'country']  # 'email' is required by default

    objects = UserManager()

    def __str__(self):
        return self.email

Вот мой класс SignUpForm на forms.py

from django import forms from allauth.account.forms import SignupForm from .choices import Gender from django_countries.widgets import CountrySelectWidget from django_countries import countries from datetime import datetime

years_range = list(range(datetime.now().year - 18, 1899, -1))

class CustomSignupForm(SignupForm): first_name = forms.CharField(max_length=30, label='First Name') last_name = forms.CharField(max_length=30, label='Last Name') birth_date = forms.DateField(label='Birth Date', widget=forms.DateInput(attrs={'class':'form-control', 'id': 'birth_date', 'type':'date'})) gender = forms.TypedChoiceField(choices=Gender.choices, coerce=int, label='Gender') country = forms.ChoiceField(choices=countries, widget=CountrySelectWidget(), label='Country')

def save(self, request, user):
    # Ensure you call the parent class's save.
    # .save() returns a User object.
    user = super(CustomSignupForm, self).save(request, user=user)
    # Add your own processing here.
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']
    user.gender = self.cleaned_data['gender']
    user.country = self.cleaned_data['country']
    user.birth_date = self.cleaned_data['birth_date']
    print(user.first_name)
    print(user.last_name)
    print(user.gender)
    print(user.country)
    print(user.birth_date)
    user.save()
    return user

Ошибка, которую я получаю:

    TypeError at /accounts/signup/
CustomSignupForm.save() missing 1 required positional argument: 'user'
Request Method: POST
Request URL:    http://127.0.0.1:8000/accounts/signup/
Django Version: 5.0.2
Exception Type: TypeError
Exception Value:    
CustomSignupForm.save() missing 1 required positional argument: 'user'
Exception Location: /home/abka/projects/dating-app-django/.venv/lib/python3.10/site-packages/allauth/account/forms.py, line 403, in try_save
Raised during:  allauth.account.views.SignupView
Python Executable:  /home/abka/projects/dating-app-django/.venv/bin/python3
Python Version: 3.10.12

А когда я вижу базу данных, она не сохраняет пользовательские поля, только поля по умолчанию, такие как email и пароль.

Кто-нибудь использовал Django-allauth с пользовательской моделью пользователя в Django 5?

Я искал в Интернете и на StackOverflow, пробовал их решения, но это не работает, вот результат, который я получаю. Похоже, большинство из них устарели.

Я тоже проверил документацию.

https://docs.allauth.org/en/latest/account/forms.html

Здесь предлагается переопределить метод сохранения. Я сделал это безрезультатно.

Я попробовал метод из документации и здесь: https://docs.allauth.org/en/latest/account/advanced.html

переопределите метод save_user следующим образом:

from allauth.account.adapter import DefaultAccountAdapter

from datetime import date

class MyAccountAdapter(DefaultAccountAdapter): def save_user(self, request, user, form, commit=True):

    user = super(MyAccountAdapter, self).save_user(request, user, form, commit=False)
    data = form.cleaned_data

    user.birth_date = data['birth_date']
    user.gender = data['gender']
    user.country = data['country']
    user.last_login = date.now()

    if commit:
        user.save()
    return user

Но я получаю ту же ошибку.

Как заставить это работать?

Кто-нибудь использовал Django-allauth с пользовательской моделью пользователя?

Вернуться на верх