Как использовать 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 с пользовательской моделью пользователя?