AUTH_USER_MODEL
錯誤在EDIT3中解決。用戶通過表單創建密碼仍然不會保存。AUTH_USER_MODEL是指未安裝和創建的模型.. AbstractUser模型無法登錄
我正在使用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 = 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'
在我們去 - 在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:
According to the docs,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'^[\[email protected]+-]+$',
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'
現在,請創建用戶,但無法登錄。當我檢查管理員中的用戶時,除密碼外,所有信息似乎都是正確的。在管理員中手動添加密碼似乎無法正常工作。但是,通過管理員正確地添加用戶。
編輯2:
我仍然無法登錄任何通過註冊形式創建了AbstractUser車型。我已經完全覆蓋了UserCreationForm
正如上文所述,並且是無法實施 get_user_model()
與此錯誤:
AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed
爲get_user_model()
Django的代碼是:
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
在clean_password2
顯示明文密碼的print password1
和print password1
語句,但print self.cleaned_data["password1"]
在save
方法是空白。爲什麼我的表單數據沒有傳遞給保存方法?
TL; DRAbstractUser
模型創建在管理員和註冊表單中均有效,但只有通過管理員創建的用戶才能夠登錄。通過註冊表單創建的用戶無法登錄,似乎無需密碼即可保存 - 所有其他信息均可正確保存。
你引用具體涉及到管理文檔。這個問題不適用於管理員。在管理員中創建用戶可正常工作。問題是在管理員之外創建用戶。 –
問題是:用管理員創建的用戶是否合適?你有沒有配置管理員使用你的新模型? – stefanw
雖然我當然非常感謝您的時間和答案,但我在原來的文章中已經努力解決所有這些問題。請參見最後一段 - 「現在,用戶已創建,但無法登錄。當我檢查管理員中的用戶時,除密碼外,所有信息似乎都正確。在管理員中手動添加密碼似乎無法正常工作,但仍然可以通過管理員正確地添加用戶。「在管理員中創建的用戶正常工作。覆蓋UserCreationForm後,用戶現在在admin之外創建,但不正確。 –