Как устранить ошибку: ошибка типа при / регистрации save() отсутствует 1 требуемый позиционный аргумент: ‘self’

#django

#django

Вопрос:

Я пытаюсь зарегистрировать пользователей с помощью AbstractUser, но я получаю сообщение об ошибке. Хотя я получаю сообщение об ошибке, пользователи все равно регистрируются, но я не могу выполнить вход с зарегистрированными пользователями.

Ошибка выглядит так: ошибка выглядит так:

Запрос post

Мой views.py идет таким образом:

 def signup(request):
    if request.method == 'POST':
        first_name = request.POST['first-name']
        last_name = request.POST['last-name']
        username = request.POST['username']
        email = request.POST['email']
        phone_no = request.POST['phone-no']
        password = request.POST['password']
        password2 = request.POST['password2'] 
        
        if password==password2:
            if CustomUser.objects.filter(username=username).exists():
                messages.info(request, 'Username Taken')
                return redirect('signup')
            elif CustomUser.objects.filter(email=email).exists():
                messages.info(request, 'Email Already Exist')
                return redirect('signup')
            else:
                CustomUser.objects.create_user(first_name=first_name, last_name=last_name, username=username, email=email, phone_no=phone_no, password=password)
                CustomUser.save(commit=False)
                return redirect('login')
        else:
            messages.info(request, 'Passwords Not Matching')
            return redirect('signup')
    else:      
        return render(request, 'signup.html')
 

И мой models.py:

 class CustomUser(AbstractUser):
    id = models.AutoField(primary_key=True)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    username = models.CharField(max_length=100, unique=True)
    email = models.EmailField(unique=True)
    password = models.CharField(max_length=150)
    phone_no = models.CharField(max_length=20)
    is_end_user = models.BooleanField(default=True)
    is_smart_earner = models.BooleanField(default=False)
    is_top_user = models.BooleanField(default=False)
 

Комментарии:

1. Удалите CustomUser.save(commit=False) . Это не имеет смысла, запись создается с create_user(...) помощью метода, и вы можете .save() моделировать только объекты . Кроме .save() того, не принимает commit=... параметр.

Ответ №1:

Удалите CustomUser.save(commit=False) . Это не имеет смысла, запись создается с помощью .create_user(…) метода [Django-doc].

Вы можете вызывать .save(…) метод [Django-doc] только для объектов модели, поскольку они представляют запись в соответствующей таблице. Использование его в CustomUser классе не имеет особого смысла, поскольку оно представляет таблицу, а сама таблица не изменяется при создании записи.

Кроме того, ваш .save() вызов использует параметр commit=… , но это тоже не имеет особого смысла: параметр .save(…) a ModelForm может принимать commit=… параметр, а не тот, который для a Model .

Однако я бы посоветовал работать с a ModelForm . Это ModelForm может автоматически проверять уникальные поля и сохранять созданного пользователя. У Django уже есть базовый ModelForm для этого: UserCreationForm [Django-doc] . С некоторыми небольшими изменениями он, вероятно, может работать для вашей пользовательской модели пользователя.