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',   
)
Вернуться на верх