AttributeError: объект 'Manager' не имеет атрибута 'normalize_email' в пакете django-username-email после перехода на PostgreSQL - PullRequest
0 голосов
/ 01 октября 2018

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

К сожалению, я столкнулся с чем-то, что не знаю, как решить.

Я использую пакет django-username-email.До перехода на PostgreSQL все работало без проблем.Теперь, когда я пытаюсь зарегистрировать пользователя, я получаю сообщение об ошибке:

[01/Oct/2018 09:17:06] "GET /accounts/signup/ HTTP/1.1" 200 5530
Internal Server Error: /accounts/signup/
Traceback (most recent call last):
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/views/generic/base.py", line 89, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/views/generic/edit.py", line 172, in post
    return super().post(request, *args, **kwargs)
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/views/generic/edit.py", line 141, in post
    if form.is_valid():
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/forms/forms.py", line 179, in is_valid
    return self.is_bound and not self.errors
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/forms/forms.py", line 174, in errors
    self.full_clean()
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/forms/forms.py", line 378, in full_clean
    self._post_clean()
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/contrib/auth/forms.py", line 106, in _post_clean
    super()._post_clean()
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/forms/models.py", line 401, in _post_clean
    self.instance.full_clean(exclude=exclude, validate_unique=False)
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/django/db/models/base.py", line 1151, in full_clean
    self.clean()
  File "/Users/Kuba/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/cuser/models.py", line 86, in clean
    self.email = self.__class__.objects.normalize_email(self.email)
AttributeError: 'Manager' object has no attribute 'normalize_email'
[01/Oct/2018 09:17:20] "POST /accounts/signup/ HTTP/1.1" 500 104567

Это не происходит, когда я регистрируюсь как суперпользователь через командную строку.Тогда все в порядке.

Исходный код файла django-username-email, в котором возникает проблема: здесь , а часть, в которой возникла ошибка:

objects = CUserManager()
...
def clean(self):
    super().clean()
    self.email = self.__class__.objects.normalize_email(self.email)

Это не сильно отличается от того, что появляется в исходном коде django

objects = UserManager()
...
def clean(self):
    super().clean()
    self.email = self.__class__.objects.normalize_email(self.email)

Честно говоря, я полностью потерян.Я понятия не имею, что не так с моим кодом.Я даже не знаю, что-то не так с моим кодом, пакетом django-username-email или django в целом.В моем случае переход на PostgreSQL из SQLite - это ужасно ...

account / templates / accounts / signup.html

{% extends "accounts/base_user.html" %}

{% block main_part %}

<h1>Sign Up</h1>

<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <input type="submit" name="" value="Sign Up">
</form>

{% endblock %}

account / форм.py

from .models import User
from django.contrib.auth.forms import UserCreationForm

class CreateUser(UserCreationForm):

    class Meta:
        model = User
        fields = ('email', 'nickname', 'password1', 'password2')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

account / models.py

from django.db import models
from django.contrib import auth
from django.utils.text import slugify

from .managers import UserManager, RelationshipManager, FriendshipManager

# Create your models here.

class User(auth.get_user_model()):
    nickname = models.CharField(max_length=127, unique=True)
    slug = models.SlugField(allow_unicode=True, unique=True)
    relationships = models.ManyToManyField('self',through='Relationship',
                                        symmetrical=False,
                                        related_name='related_to')
    friendships = models.ManyToManyField('self', through='Friendship',
                                        symmetrical=False,
                                        related_name='friend_to+')

    objects = models.Manager()
    actions = UserManager()

    def __str__(self):
        return self.nickname

    def save(self, *args, **kwargs):
        self.slug = slugify(self.nickname)
        super().save(*args, **kwargs)

accounts / views.py

class SignUp(CreateView):
    template_name = 'accounts/signup.html'
    form_class = forms.CreateUser
    success_url = reverse_lazy('accounts:login')

settings.py

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 'debug_toolbar',
    'cuser',
    'accounts',
    'groups',
    'posts',
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'django',
        'USER': 'postgres',
        'PASSWORD': 'testpassword',
        'HOST': 'localhost',
        'PORT': '',
    }
}

AUTH_USER_MODEL = 'cuser.CUser'

Я использую виртуальную среду Anaconda.Версии пакетов в среде:

  • django 2.0.7
  • python 3.6.4
  • django-username-email 2.2.1
...