Как исправить 'Менеджер не доступен; 'auth.User' был заменен ' - PullRequest
0 голосов
/ 22 июня 2019

Я настраиваю CustomUser для использования электронной почты в качестве имени пользователя (исключая имя пользователя). Это руководство, которому я следовал. https://wsvincent.com/django-referencing-the-user-model/

Я пытался использовать get_user_model, включая AUTH_USER_MODEL = 'core_app.CustomUser' в настройках. Когда я пытаюсь зарегистрироваться, используя функцию registrationcompany, я получаю сообщение об ошибке.

settings.py

AUTH_USER_MODEL = 'core_app.CustomUser'
INSTALLED_APPS = [
    'accounts',
    'core_app.apps.CoreAppConfig',
]

core_app / models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.utils.translation import gettext_lazy as _

from .managers import CustomUserManager


class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, null=True)

    USERNAME_FIELD = 'email'
    objects = CustomUserManager()

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

core_app / managers.py

from django.contrib.auth.models import BaseUserManager


class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **kwargs):
        if not email:
            raise ValueError('Email field is required')

        email = self.normalize_email(email)
        user = self.model(email=email, **kwargs)
        user.set_password(password)
        user.save()
        return user

Счета / views.py

def registercompany(request):
    if request.method =='POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            new_user = form.save()
            new_user = authenticate(username=form.cleaned_data['username'],
                                    password=form.cleaned_data['password1'],
                                    )
            login(request, new_user)
            return redirect(reverse('nonprofits:filterview'))
    else:
        form = RegistrationForm()

        args = {'form': form}
        return render(request, 'accounts/reg_form_company.html', args)

Счета / models.py

from django.db import models
from django.contrib.auth import get_user_model

class UserProfile(models.Model):
    user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
    organisation_name = models.CharField(blank=True, default='',
    objects = models.Manager()

    def __str__(self):
        return self.user.username


def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create_profile, sender=get_user_model())

Счета / forms.py

...
from django.contrib.auth import get_user_model
from .models import UserProfile
from core_app.models import CustomUser
...


class RegistrationForm(UserCreationForm):

    email = forms.EmailField(required=True)

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']

        if commit:
            user.save()
        if commit:
            user = super(RegistrationForm, self).save(commit=False)
            user.userprofile.save()

        return user

Это ошибка, которую я хочу помочь исправить.

Traceback

AttributeError at /account/register/company
Manager isn't available; 'auth.User' has been swapped for 'core_app.CustomUser'
Request Method: POST
Request URL:    http://127.0.0.1:8000/account/register/company
Django Version: 2.2.2
Exception Type: AttributeError
Exception Value:    
Manager isn't available; 'auth.User' has been swapped for 'core_app.CustomUser'
Exception Location: /.../venv/lib/python3.7/site-packages/django/db/models/manager.py in __get__, line 188

/.../accounts/views.py in registercompany
        if form.is_valid(): …
▼ Local vars
Variable    Value
form    
<RegistrationForm bound=True, valid=False, fields=(username;password1;password2;email;account_type;organisation_name)>
request 
<WSGIRequest: POST '/account/register/company'>
...