- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
AUTH_USER_MODEL
错误已在 EDIT3 中解决。通过表单创建用户时,密码仍然不会保存。
我正在使用 Django 1.5 使用新的用户覆盖/扩展功能,我无法通过我的注册表单注册新用户 - 只能通过管理员。通过注册表单注册时,我收到以下错误:
管理器不可用;用户已被替换为“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'
开始吧 - 我在 views.py
中的注册 View :
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'^[\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
这能够解决这个错误:
管理器不可用;用户已被替换为“poker.PokerUser”
现在,用户已创建但无法登录。当我在管理员中检查用户时,所有信息似乎都是正确的,除了密码。在管理员中手动添加密码似乎无法正常工作。尽管如此,通过管理员添加用户仍然可以正常工作。
编辑 2:
我仍然无法以通过注册表单创建的任何 AbstractUser 模型登录。如上所述,我已经完全覆盖了 UserCreationForm
,并且无法实现get_user_model()
出现此错误:
AUTH_USER_MODEL 指的是尚未安装的模型“poker.PokerUser”
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
由于我的 settings.py
中有 AUTH_USER_MODEL = 'poker.PokerUser'
设置,这应该可以工作。我已经通过 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 指的是尚未安装的模型'poker.PokerUser'
已修复。我不小心拥有了在 poker.models
而不是 registration.forms
中重新创建的 UserCreationForm
,所以当我运行 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 方法?save
方法中的 "]
TL;DR AbstractUser
模型创建在管理员和注册表单中都有效,但只有通过管理员创建的用户才能登录。通过注册表创建的用户无法登录,并且似乎在没有密码的情况下保存 - 所有其他信息都正确保存。
最佳答案
我遇到过几次。一直是进口问题。假设我们有 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 去 import Else 时,它会评估 something/models.py 并运行到 AnotherClass 定义中。 AnotherClass 使用 CustomUser,但尚未安装 CustomUser,因为我们正在创建它。所以,它会抛出这个错误。
我通过保持 core/models.py 独立解决了这个问题。它不会从我的其他应用中导入太多内容。
关于python - AUTH_USER_MODEL 指的是尚未安装和创建的模型 .. AbstractUser 模型无法登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14699598/
我是 django 的初学者,我正在研究用户身份验证。我正在使用 Abstractuser 和默认的 User 模型来创建用户。但是,收集了很多对我的项目没有用的不必要信息。 这是我的models.p
我有一个继承 AbstractUser 的模型,如下所示: class Driver(AbstractUser): dni = models.CharField(max_length=8,vali
我想添加一个 Django 用户字段。所以我检查了这个文档:https://docs.djangoproject.com/en/1.8/topics/auth/customizing/ 我决定使用 A
我正在 Django 1.5 中开发一个学校数据库系统,并计划拥有许多不同的用户类型(学生、教职员工、家长),它们是 AbstractUser 的子类(实际上是 AbstractUser 的另一个抽象
我试图继承 AbstractUser 并在运行 migrate 时遇到错误,makemigrations 说 No changes detected django.db.utils.Programmi
AUTH_USER_MODEL 错误已在 EDIT3 中解决。通过表单创建用户时,密码仍然不会保存。 我正在使用 Django 1.5 使用新的用户覆盖/扩展功能,我无法通过我的注册表单注册新用户 -
所以我一直在互联网上搜索一个完整的例子,当你有至少 2 个不同的模型时如何使用 AbstractUser。没有找到任何决定性的东西......至少可以在最新版本的 Django (2.0.1) 上工作
我正在使用 AbstractUser 模型来创建自定义身份验证模型。 问题是我无法覆盖用户名字段的默认表单字段验证器,这是我迄今为止尝试过的: class RegularUserForm(forms.
我使用 ugettext_lazy 来翻译默认的 AbstractBaseUser 字段,我发现了一个问题。我想将名为 password 的字段翻译为我的母语,但我收到的唯一结果是 django.co
我正在尝试集成两个 django 应用程序,每个应用程序都有各自的身份验证工作。为此,我尝试对 AbstractUser 而不是 User 进行子类化。我正在关注PyBB docs和 Django#s
我正在使用 Django 1.6 + MySQL。我的模型有一个扩展 AbstractUser 的 custom_user 类。 class CustomUser(AbstractUser):
我有一个扩展/继承 AbstractUser 的客户用户模型。我还希望管理员中的用户创建表单匹配,但出于某种原因我只能让它显示用户名和密码字段。没有其他的。 我发现特别有趣的是,我对 admin.py
应用名称后端 用户对象返回错误: users = User.objects.filter(fb_userid=fb_user_id) AttributeError: type object 'User
AbstractUser 和AbstractBaseUser 的使用看起来很相似。 from django.contrib.auth.models import AbstractUser, Abstr
我正在尝试在 models.py 中使用我的 Person 类作为用户。不过我尝试使用 AbstractUser 和 AbstractBaseUser。在我尝试登录的部分,它们都给了我错误,我尝试了多
原始问题 我想为 3 种类型的用户创建 3 个用户配置文件。起初,我做了一个 CharFiled 作为标记来区分它们,但后来我意识到我必须放置一些 ForeignKey 来关联这些用户。至于这一步,我
我在 Django 1.5.4(稳定版)上没有错误,但是当我从官方 tar.gz 在 Django 1.6 beta 4 上测试我的应用程序时,我在启动时遇到验证模型错误。 models.py fro
我已经使用 AbstractUser 方法为 django 扩展了用户模型。问题是,我的自定义字段没有显示在 Django 管理面板中。 我的模型.py: from django.contrib.au
将我的项目从 django 1.7.4 迁移到 1.8.5 时遇到了一个奇怪的问题 在我的项目中,我像这样扩展基本的用户模型: 应用用户: class User(AbstractUser):
我在我的reg_group应用的models.py中创建了一个AbstractUser类 from django.contrib.auth.models import AbstractUser fro
我是一名优秀的程序员,十分优秀!