UserManager.create_user() missing 1 required positional argument: 'username' error while logging in with python-social-auth
Я создал пользовательскую модель пользователя AbstractUser и использую python-social-auth для входа в систему через Steam. Но когда я пытаюсь войти в систему пользователя, я получаю эту ошибку. Я пробовал добавить имя пользователя в REQUIRED_FIELDS, но в обоих случаях я получаю одну и ту же ошибку.
models.py
from django.db import models
from django.conf import settings
from django.contrib.auth.models import AbstractUser
# Create your models here.
class CustomUser(AbstractUser):
username = models.CharField(max_length=200, null=True)
name = models.CharField(max_length=200, unique=True)
steam_name = models.CharField(max_length=32, blank=True)
steam_id = models.CharField(max_length=17, unique=True, blank=True, null=True)
extra_data = models.TextField(null=True)
is_active = models.BooleanField(default=True, db_column='status')
is_staff = models.BooleanField(default=False, db_column='isstaff')
is_superuser = models.BooleanField(default=False, db_column='issuperuser')
USERNAME_FIELD = "name"
REQUIRED_FIELDS = ["username"]
pipeline.py
from .models import CustomUser
def save_profile(backend, user, details, response, *args, **kwargs):
CustomUser.objects.get_or_create(
steam_name = user,
steam_id = details['player']['steamid'],
extra_data = details['player'],
)
settings.py
AUTH_USER_MODEL = 'main.CustomUser'
SOCIAL_AUTH_PIPELINE = (
'social_core.pipeline.social_auth.social_details',
'social_core.pipeline.social_auth.social_uid',
'social_core.pipeline.social_auth.social_user',
'social_core.pipeline.user.get_username',
'social_core.pipeline.social_auth.associate_by_email',
'social_core.pipeline.user.create_user',
'social_core.pipeline.social_auth.associate_user',
'social_core.pipeline.social_auth.load_extra_data',
'social_core.pipeline.user.user_details',
'main.pipeline.save_profile',
)
Я нашел рабочее решение для своего проекта. Я не совсем уверен, почему это так, но это работает отлично, и я получаю все, что мне нужно.
Мне нужно было создать свой собственный менеджер пользователей для моей пользовательской модели пользователя, и я обнаружил, что имя пользователя внутри моего метода create_user не имеет значения, но значение было в extra_fields. Итак, вот мой код для решения, которое работает для меня.
models.py
from django.db import models
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from .managers import CustomUserManager
# Create your models here.
class CustomUser(AbstractUser):
username = models.CharField(max_length=32, blank=True, null=True)
name = models.CharField(max_length=200, unique=True, blank=True, null=True)
steam_id = models.CharField(max_length=17, unique=True, blank=True, null=True, db_column='steam_id')
player = models.TextField(null=True)
user_coins = models.FloatField(default=0)
is_active = models.BooleanField(default=True, db_column='status')
is_staff = models.BooleanField(default=False, db_column='isstaff')
is_superuser = models.BooleanField(default=False, db_column='issuperuser')
USERNAME_FIELD = "name"
REQUIRED_FIELDS = []
objects = CustomUserManager()
def has_perm(self, perm, obj=None):
return self.is_superuser
def has_module_perms(self, app_label):
return self.is_superuser
managers.py
from django.contrib.auth.base_user import BaseUserManager
class CustomUserManager(BaseUserManager):
def _create_user(self, username, password, is_staff, is_superuser, **extra_fields):
if not username:
raise ValueError('Steam name must be set')
user = self.model(
username=username,
steam_id=extra_fields['player']['steamid'],
is_active=True,
is_staff=is_staff,
is_superuser=is_superuser,
player=extra_fields['player']
)
if password:
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, password=None, **extra_fields):
return self._create_user(extra_fields['name'], password, False, False, **extra_fields)
def create_superuser(self, username, password=None, **extra_fields):
user=self._create_user(username, password, True, True, **extra_fields)
user.save(using=self._db)
return user
settings.py
USER_FIELDS = ['username', 'player']
SOCIAL_AUTH_PIPELINE = (
'social_core.pipeline.social_auth.social_details',
'social_core.pipeline.social_auth.social_uid',
'social_core.pipeline.social_auth.social_user',
'social_core.pipeline.user.get_username',
'social_core.pipeline.social_auth.associate_by_email',
'social_core.pipeline.user.create_user',
'social_core.pipeline.social_auth.associate_user',
'social_core.pipeline.social_auth.load_extra_data',
'social_core.pipeline.user.user_details',
)