Я прочитал и перечитал другие вопросы, касающиеся этой проблемы, и я все еще не могу создать пользовательскую модель пользователя Django. Я получаю сообщение об ошибке: Manager isn't available; 'auth.User' has been swapped for 'Users.User'
.
Если ошибка не ясна, я создал приложение Users
, в котором файл models.py
определяет пользовательский класс пользователя User
.
Вот соответствующие файлы из моего проекта, UserTest
:
- Регистрация приложения с указанием пользовательской модели пользователя:
UserTest> UserTest> settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Users'
]
AUTH_USER_MODEL = 'Users.User'
- Расширение класса пользователя Django по умолчанию через мою модель
User
и подключение его к модели Profile
(не строго относится к проблеме, но является фундаментальным аспектом подхода.)
UserTest> Пользователи> models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
email = models.CharField(max_length=128, blank=False, unique=True, verbose_name='Email', name='email')
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
...
- Регистрация новой модели
User
в моем Users
приложении admin.py (не уверен, требуется ли это для тестирования функциональности быстрого интерфейса?)
UserTest> Пользователи> admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
Я создал несколько базовых форм и представление, позволяющее внешнему интерфейсу отправлять соответствующие данные пользователя и профиля. Учитывая ошибку, я не чувствовал, что они были актуальны, но я могу включить их, если кто-то считает, что они есть Опять ошибка следующая:
Manager isn't available; 'auth.User' has been swapped for 'Users.User'
Первоначально я создал пользовательскую модель User
, используя класс AbstractBaseUser
, который в документации описывает, что пользовательский класс Manager должен также быть создан. У меня была та же ошибка при использовании этого подхода, и я не читал, что при использовании этого подхода требовалась та же настройка, полагаясь на AbstractUser
В моем файле UserTest> Users> forms.py я пытался получить доступ к моей модели Users.models.User
одним из следующих способов:
- Путем прямого импорта как такового:
from .models import User
- Используя функцию Django
get_user_model()
как таковую:
from django.contrib.auth import get_user_model
User = get_user_model()
Второй подход, похоже, решил эту проблему для многих других, например, вопрос ЗДЕСЬ , но он мне не помогает (если я что-то упустил).
Полный ответ об ошибке здесь:
Internal Server Error: /test-form/
Traceback (most recent call last):
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\...\Desktop\UserTest\Users\views.py", line 19, in NewUserRegistration
print("USERFORM:", user_form, type(user_form), dir(user_form))
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\utils\html.py", line 397, in <lambda>
klass.__str__ = lambda self: mark_safe(klass_str(self))
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\forms\forms.py", line 142, in __str__
return self.as_table()
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\forms\forms.py", line 284, in as_table
errors_on_separate_row=False,
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\forms\forms.py", line 202, in _html_output
top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\forms\forms.py", line 313, in non_field_errors
return self.errors.get(NON_FIELD_ERRORS, self.error_class(error_class='nonfield'))
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\forms\forms.py", line 180, in errors
self.full_clean()
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\forms\forms.py", line 383, in full_clean
self._post_clean()
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\contrib\auth\forms.py", line 107, in _post_clean
super()._post_clean()
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\forms\models.py", line 403, in _post_clean
self.instance.full_clean(exclude=exclude, validate_unique=False)
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\db\models\base.py", line 1137, in full_clean
self.clean()
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\contrib\auth\models.py", line 338, in clean
self.email = self.__class__.objects.normalize_email(self.email)
File "C:\Users\...\Desktop\UserTest\venv\lib\site-packages\django\db\models\manager.py", line 188, in __get__
cls._meta.swapped,
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'Users.User'
[26/Oct/2018 09:47:02] "POST /test-form/ HTTP/1.1" 500 118088
Я ценю любую помощь. Обычно, если я могу напечатать весь пост на SO без «ага» момента, я знаю, что я довольно испорчен.
ОБНОВЛЕНИЕ 1: добавление forms.py
и views.py
В моем приложении UserTest > Users
views.py
и forms.py
выглядят следующим образом:
UserTest> Пользователи> forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.core.exceptions import ValidationError
from django.contrib.auth import get_user_model
User = get_user_model()
class NewUser(UserCreationForm):
email = forms.EmailField(max_length=96)
password = forms.PasswordInput()
username = forms.CharField(max_length=18)
def clean_email(self):
email = self.cleaned_data['email'].lower()
r = User.objects.filter(email=email)
if r.count():
raise ValidationError("Email already exists")
return email
def save(self, commit=True):
user = User.objects.create_user(
self.cleaned_data['email'],
self.cleaned_data['password'],
self.cleaned_data['username']
)
return user
ПРИМЕЧАНИЕ: здесь я попробовал как get_user_model()
подход, так и импорт моего пользовательского User
класса из Users.models
, и ни один из них не устранил ошибку.
UserTest> Пользователи> views.py
from django.shortcuts import render
from django.contrib import messages
from .forms import NewUser
def NewUserRegistration(request):
if request.method == 'POST':
user_form = NewUser(request.POST)
if user_form.is_valid():
user_form.save()
messages.success(request, 'Account Created Successfully!')
else:
user_form = NewUser()
return render(request, 'Users/test-form.html', {'user_form': user_form})