Модель пользователя AUTH относится к модели. который не был установлен и создан abstractuser модели не в состоянии войти
AUTH_USER_MODEL
ошибка решена в EDIT3. Пароли по-прежнему не сохраняются при создании пользователя через форму.
я использую Django 1.5, играя с новыми функциями переопределения/расширения пользователя, и я не могу зарегистрировать новых пользователей через мою регистрационную форму - только через администратора. При регистрации через регистрационную форму, я получаю следующую ошибку:
Manager isn't available; User has been swapped for 'poker.PokerUser'
models.py:
class PokerUser(AbstractUser):
poker_relate = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
token = models.EmailField()
USER_CHOICES = (
('1', 'Staker'),
('2', 'Horse')
)
user_type = models.CharField(choices=USER_CHOICES, max_length=10)
username1 = models.CharField(null=True, blank=True, max_length=40)
username2 = models.CharField(null=True, blank=True, max_length=40)
username3 = models.CharField(null=True, blank=True, max_length=40)
username4 = models.CharField(null=True, blank=True, max_length=40)
username5 = models.CharField(null=True, blank=True, max_length=40)
PokerUserForm
модель:
class PokerUserForm(UserCreationForm):
class Meta:
model = PokerUser
fields = ('username','password1','password2','email','user_type','token','username1','username2','username3','username4','username5',)
я попытался изменить модель в PokerUserForm
модель get_user_model()
вместо явного определения модели с помощью параметра model = get_user_model()
вместо model = PokerUser
но затем я получаю следующую ошибку:
django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed
мой AUTH_USER_MODEL
настройки в моем settings.py
вот так:
AUTH_USER_MODEL = 'poker.PokerUser'
On We go - мой регистрационный вид в views.py
:
def UserRegistration(request):
player = PokerUser()
if request.method == 'POST':
form = PokerUserForm(request.POST, instance=player)
if form.is_valid():
player.email_address = form.cleaned_data['email']
player.user_type = form.cleaned_data['user_type']
# if player is staker, token is their own email. otherwise their token is their staker's email and
# their relation is their staker
if player.user_type == '1' or player.user_type == 'staker':
player.token = player.email_address
else:
player.token = form.cleaned_data['token']
staker = PokerUser.objects.get(email=player.token)
player.poker_relate = staker
player.save()
return HttpResponseRedirect('/')
else:
form = PokerUserForm()
initialData = {'form': form}
csrfContext = RequestContext(request, initialData)
return render_to_response('registration/register.html', csrfContext)
EDIT1:
по данным документы, the UserCreationForm
необходимо воссоздать для использования с пользовательскими классами.
я проехал весь UserCreationForm
следующим образом:
class UserCreationForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and
password.
"""
error_messages = {
'duplicate_username': _("A user with that username already exists."),
'password_mismatch': _("The two password fields didn't match."),
}
username = forms.RegexField(label=_("Username"), max_length=30,
regex=r'^[w.@+-]+$',
help_text=_("Required. 30 characters or fewer. Letters, digits and "
"@/./+/-/_ only."),
error_messages={
'invalid': _("This value may contain only letters, numbers and "
"@/./+/-/_ characters.")})
password1 = forms.CharField(label=_("Password"),
widget=forms.PasswordInput)
password2 = forms.CharField(label=_("Password confirmation"),
widget=forms.PasswordInput,
help_text=_("Enter the same password as above, for verification."))
class Meta:
model = PokerUser
fields = ('username','password1','password2','email','user_type','token','username1','username2','username3','username4','username5',)
def clean_username(self):
# Since User.username is unique, this check is redundant,
# but it sets a nicer error message than the ORM. See #13147.
username = self.cleaned_data["username"]
try:
PokerUser.objects.get(username=username)
except PokerUser.DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate_username'])
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'])
return password2
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
и это смогло разрешить эту ошибку:
The Manager isn't available; User has been swapped for 'poker.PokerUser'
теперь пользователи создаются, но не могут войти в систему. Когда я проверяю пользователей в Администраторе, вся информация кажется правильной, за исключением пароля. Добавление пароля вручную в админке не работает правильно. Тем не менее, добавление пользователей через admin работает правильно.
EDIT 2:
я все еще не могу войти в систему как любая из моих моделей AbstractUser, созданных через регистрационную форму. Я полностью переопределил UserCreationForm
как описано выше, и я не могу реализовать
get_user_model()
С этой ошибкой:
AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed
код Django для get_user_model()
- это:
def get_user_model():
"Return the User model that is active in this project"
from django.conf import settings
from django.db.models import get_model
try:
app_label, model_name = settings.AUTH_USER_MODEL.split('.')
except ValueError:
raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
user_model = get_model(app_label, model_name)
if user_model is None:
raise ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL)
return user_model
так как у меня AUTH_USER_MODEL = 'poker.PokerUser'
настройки в моем settings.py
этот должен работать. Я проверил это через консоль Django:
>>> from django.contrib.auth import get_user_model
>>> settings.AUTH_USER_MODEL
Out[14]: 'poker.PokerUser'
>>> from django.db.models import get_model
>>> app_label, model_name = settings.AUTH_USER_MODEL.split('.')
>>> user_model = get_model(app_label, model_name)
>>> user_model
Out[18]: poker.models.PokerUser
реализация по-прежнему не работает правильно.
если вы читали это далеко, Спасибо!
EDIT3:
AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed
исправлено. У меня случайно был UserCreationForm
что я воссоздал в poker.models
вместо registration.forms
, поэтому, когда я побежал get_user_model()
это было назначено poker.PokerUser
, он не мог решить, так как он уже был в этом местоположение.
только проблема в том, что при создании новых пользователей, их пароли не спасут. Я сузил его до одного метода в UserCreationForm
разместив здесь инструкции печати:
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
print password1
password2 = self.cleaned_data.get("password2")
print password2
if password1 and password2 and password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'])
print password2
return password2
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
print self.cleaned_data["password1"]
if commit:
user.save()
return user
на print password1
и print password1
заявления в clean_password2
отображение пароля простого текста, но print self.cleaned_data["password1"]
на save
метод пустым. Почему мои данные не передаются в метод save?
TL; DR AbstractUser
создание модели работает как в Admin, так и через регистрационную форму, но только пользователи, созданные через Admin, могут войти в систему. Пользователи, созданные с помощью регистрационной формы, не могут войти в систему и, похоже, сохраняются без пароля - вся остальная информация сохраняется правильно.
4 ответов
хорошо, здесь было три вопроса для меня, поэтому я собираюсь обратиться ко всем из них, так как я уверен, что первые два придумают для кого-то другого.
Manager isn't available; User has been swapped for 'poker.PokerUser'
это связано с использованием, но не воссоздавая UserCreationForm
. При использовании пользовательских моделей в 1.5 некоторые формы моделей доступны из коробки, но эту необходимо воссоздать. См.здесь для доктора.
The Manager isn't available; User has been swapped for 'poker.PokerUser'
а у меня AUTH_USER_MODEL = 'poker.PokerUser'
установить в мой settings.py
, Я звонила get_user_model()
С poker.models
расположение. Вы должны позвонить get_user_model()
из другого места. Движется моя форма registration.forms
, а вызов get_user_model()
оттуда работал правильно.
- новые пользователи не экономя
это был просто заскок с моей стороны. В моем UserRegistration
модель я манипулировал различными полями из формы. Когда я проходил мимо них поля назад в UserCreationForm
на save()
метод, я не передавал поля пароля с ним. Ой!
Я сталкивался с этим несколько раз. Это всегда было проблемой импорта. Предположим, у нас есть core/models.py это реализует пользовательского пользователя и импортирует символ из другого файла (скажем, Else):
from Something import Else
class CustomUser(AbstractBaseUser):
pass
и тогда у нас есть другой файл, который использует CustomUser, а также определяет Else. Давай назовем это something/models.py:
from core.models import CustomUser
class Else(models.Model):
pass
class AnotherClass(models.model):
user = models.ForeignKey(CustomUser)
когда core/models.py переходит к импорту Else, он оценивает something/models.py и попадает в определение AnotherClass. AnotherClass использует CustomUser, но CustomUser еще не установлен, потому что мы находимся в процессе его создания. Таким образом, он выбрасывает эту ошибку.
Я решил эту проблему, сохранив мой core/models.py автономно. Он не импортирует много из моих других приложений.
в моем случае обновление, правильное app_label в meta решило эту проблему
class APPUser(AbstractUser):
password = models.TextField(blank=True)
class Meta:
app_label = 'app_auth'
db_table = "app_user"
процитировать документы Django:
вам также необходимо зарегистрировать пользовательскую модель пользователя у администратора. Если пользовательская модель расширяется Джанго.ВНО.автор.модели.AbstractUser, вы можете использовать существующий Django Джанго.ВНО.автор.администратор.Класс UserAdmin.
проверьте содержимое вашего admin.py
файл и убедитесь, что вы зарегистрировали свою пользовательскую модель в системе администратора с помощью django.contrib.auth.admin.UserAdmin
класса.