我正在尝试将django-allauth与自定义用户模型集成(子类化AbstractUser,但是当我测试注册表单时,由于字段(date_of_birth)为null,我得到完整性错误,但提交的值是u'1976-4- 6'
我正在学习新的自定义用户的东西,以及基于类的视图,因为我正在学习django-allauth,所以我有信心我做错了什么,但经过几天阅读github问题,几个教程,readthedocs和stackoverflow问题我仍然不清楚我做错了什么(我知道有一件事我做错了:在这里和那里尝试不同的解决方案,所以我肯定有一个错误的实现)
但是,我找不到如何将allauth与子类AbstractUser集成的好答案,所以如果有人能够启发我,我会非常感激.
(注意 - 当我以通过固定装置加载的用户身份登录时,网站或多或少有效,所以请假设非django-allauth遗漏是遗漏 - 如果您需要澄清下面的内容,我会很高兴编辑)
AUTH_USER_MODEL = 'userdata.CtrackUser'
ACCOUNT_AUTHENTICATION_METHOD = 'username_email'
ACCOUNT_SIGNUP_FORM_CLASS = 'userdata.forms.SignupForm'
LOGIN_REDIRECT_URL = '/profile'
SOCIALACCOUNT_QUERY_EMAIL = True
SOCIALACCOUNT_AUTO_SIGNUP = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = 'username'
Run Code Online (Sandbox Code Playgroud)
class CtrackUser(AbstractUser):
date_of_birth = models.DateField(help_text='YYYY-MM-DD format')
gender = models.CharField(max_length=2,
choices=settings.GENDER_CHOICES, blank=True)
race = models.CharField(max_length=2, choices=settings.RACE_CHOICES, null=True, blank=True)
condition = models.ForeignKey(Condition, null=True, blank=True)
location = models.CharField(max_length=255, null=True, blank=True)
my_symptoms = models.ManyToManyField(Symptom)
is_admin = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)
from django import forms
from django.conf …Run Code Online (Sandbox Code Playgroud) 我正在按照 Wagtail 文档来自定义用户模型。我想将图像添加到用户模型中。
Django 版本:2.0.8,Wagtail 版本:2.1
问题
使用图像选择器字段选择图像并单击“保存”后,出现以下错误:
'没有提交文件。检查表单上的编码类型。”
代码
模型.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
display_image = models.ForeignKey('wagtailimages.Image',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+')
Run Code Online (Sandbox Code Playgroud)
表格.py
from django import forms
from django.utils.translation import ugettext_lazy as _
from wagtail.users.forms import UserEditForm, UserCreationForm
from wagtail.images.widgets import AdminImageChooser
class CustomUserEditForm(UserEditForm):
display_image = forms.ImageField(
widget=AdminImageChooser(), label=_('Autorenbild'))
class CustomUserCreationForm(UserCreationForm):
display_image = forms.ImageField(
widget=AdminImageChooser(), label=_('Autorenbild'))}
Run Code Online (Sandbox Code Playgroud)
编辑.html
{% extends "wagtailusers/users/edit.html" %}
{% block extra_fields %}
{% include "wagtailadmin/shared/field_as_li.html" with field=form.display_image %}
{% …Run Code Online (Sandbox Code Playgroud) 在 Django 中实现了自定义用户模型,并允许用户使用 URL http://127.0.0.1:8000/users/signup/进行注册。对此 url 的 GET 请求显示如下:
我已经为此页面编写了测试。测试是否get按预期工作。
我编写测试的post目的是让帖子在测试数据库中创建一个用户。之后我可以编写测试来确认是否创建了用户以及用户名是否匹配等等。但似乎用户没有被创建。以下是我的测试
class SignUpPageTests(TestCase):
def setUp(self) -> None:
self.username = 'testuser'
self.email = 'testuser@email.com'
self.age = 20
self.password = 'password'
def test_signup_page_url(self):
response = self.client.get("/users/signup/")
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, template_name='signup.html')
def test_signup_page_view_name(self):
response = self.client.get(reverse('signup'))
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, template_name='signup.html')
def test_signup_form(self):
response = self.client.post(reverse('signup'), data={
'username': self.username,
'email': self.email,
'age': self.age,
'password1': self.password,
'password2': self.password
})
self.assertEqual(response.status_code, 200)
users = get_user_model().objects.all()
self.assertEqual(users.count(), 1)
Run Code Online (Sandbox Code Playgroud)
users.count() 结果是 0,我的测试失败了。我哪里错了?
python django django-forms django-unittest django-custom-user
为我的 python django 应用程序创建自定义用户后,我开始收到标题上所述的错误。仅当我不想从管理面板添加新用户时才会发生这种情况,即当我收到错误“为用户指定的未知字段(用户名)。检查 CustomUserAdmin 类的字段/字段集/排除属性”时。我尝试在互联网上到处寻找答案,但没有成功。管理员.py:
# accounts/admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import User
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = User
list_display = ['email', 'first_name','last_name', 'image', 'country_code','country', 'phone','state_province','city_town','address', 'postal_code',]
add_fieldsets = UserAdmin.add_fieldsets + (
(None, {'fields': ('email', 'first_name', 'last_name', 'image', 'country_code','country', 'phone','state_province','city_town','address', 'postal_code',)}),
)
fieldsets = (
(None, {
"fields": (
('email', 'first_name', 'last_name', 'image', 'is_staff', 'country_code','country', 'phone','state_province','city_town','address', 'postal_code',)
),
}), …Run Code Online (Sandbox Code Playgroud) 尝试设置扩展基本用户的自定义用户模型。有些用户会有登录信息,有些则没有,但我仍然希望所有用户都登录。这就是我认为错误所说的。
在默认的 Django 模型中,他们被记录下来,但现在一些用户只有 IP 地址和用户名。其他用户将获得更多信息,例如电子邮件等。
出现此错误:
AttributeError: 'CustomUser' object has no attribute 'is_anonymous'
Run Code Online (Sandbox Code Playgroud)
这是我的自定义用户类:
class MyUserManager(BaseUserManager):
def create_user(first_name, last_name, address1, state, zipcode, email, username, password):
user=self.model(
first_name = first_name,
last_name = last_name,
address1 = address1,
zipcode = zipcode,
state = state,
email=email,
username = username,
password = password
)
user.is_superuser = False
user.is_admin = False
user.is_staff = False
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_superuser', …Run Code Online (Sandbox Code Playgroud) 请帮助 !!
我有一个在项目中使用的自定义用户模型。当新用户注册时,我通过使用信号为他们创建一个钱包。
@receiver(post_save, sender=User)
def create_saving_wallet(sender, instance, **kwargs):
[...]
Run Code Online (Sandbox Code Playgroud)
在函数中,我正在做一些基本的事情,比如
wallet = Wallet(user_id=user_id, wallet_type=wallet_type, amout=amount)
wallet.save()
Run Code Online (Sandbox Code Playgroud)
而且,我在app.py这个类中发送信号:
from django.apps import AppConfig
from django.core.signals import request_finished
class MyAppConfig(AppConfig):
def ready(self):
from wallet import views
# Explicitly connect a signal handler.
request_finished.connect(views.create_saving_wallet, dispatch_uid="azerty123")
Run Code Online (Sandbox Code Playgroud)
当我们使用注册表时,一切正常,但如果我们使用管理站点登录,则会调用信号,然后更新旧钱包。
我该怎么做才能避免这种行为?
当调用我的自定义用户的save()方法时,应该只调用该信号。我不确定,但由于我有这个错误,这是否意味着当用户登录时,会调用 save() 方法?
我通过扩展 AbstractBaseUser 自定义了用户模型,用户名仅被接受为电子邮件 ID。这是模型:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField('email address', unique=True)
first_name = models.CharField('first name', max_length=30, blank=True)
last_name = models.CharField('last name', max_length=30, blank=True)
date_joined = models.DateTimeField('date joined', auto_now_add=True)
is_active = models.BooleanField('active', default=True)
is_staff = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
class Meta:
verbose_name = 'user'
verbose_name_plural = 'users'
def get_full_name(self):
full_name = '%s %s' % (self.first_name, self.last_name)
return full_name.strip()
def get_short_name(self):
return self.first_name
def email_user(self, subject, message, from_email=None, **kwargs):
send_mail(subject, message, from_email, [self.email], **kwargs)
Run Code Online (Sandbox Code Playgroud)
上述模型的模型管理器是: …
我CustomUser喜欢以下内容:
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=100, unique=True)
username = models.CharField(max_length=20, unique=True)
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
...
Run Code Online (Sandbox Code Playgroud)
即active default=False
用户注册后自动处理UserLogindef ,即:
def UserLogin(request):
if request.POST:
username = request.POST['username']
user = authenticate(username=username, password=request.POST['password'])
print('user :', user) # which is print None if user inactive
if user is not None:
print('is user active:', user.is_active) # should print True or False
if user.is_active:
login(request, user)
...
else: # handle user inactive
...
else: # for None …Run Code Online (Sandbox Code Playgroud) 我正在阅读django 初学者书籍,\xc2\xa0 测试第 8 章中有关自定义用户模型的代码。目标是age通过对模型进行子类化来在 auth 用户模型中添加该字段AbstractUser。
首先我们创建CustomUser出models.py
from django.db import models\nfrom django.contrib.auth.models import AbstractUser\n\nclass CustomUser(AbstractUser):\n age = models.PositiveIntegerField(null=True, blank=True)\nRun Code Online (Sandbox Code Playgroud)\n\n然后创建CustomUserCreationFrom并CustomUserChangeFrom在forms.py:
from django import forms\nfrom django.contrib.auth.forms import UserCreationForm, UserChangeForm\n\nfrom .models import CustomUser\n\nclass CustomUserCreationFrom(UserCreationForm):\n class Meta(UserCreationForm.Meta):\n model = CustomUser\n fields = UserCreationForm.Meta.fields + (\'age\',)\n\nclass CustomUserChangeFrom(UserChangeForm):\n class Meta(UserChangeForm.Meta):\n model = CustomUser\n fields = UserChangeForm.Meta.fields\nRun Code Online (Sandbox Code Playgroud)\n\n最后,CustomUserAdmin在admin.py:
from …Run Code Online (Sandbox Code Playgroud) 我删除了username字段,因为我希望用户能够使用他们的电子邮件地址登录,所以我在我的models.py:
class CustomUser(AbstractUser):
USER_TYPE = ((1, 'HOD'), (2, 'Staff'), (3, 'Student'))
username = None
email = models.EmailField(unique=True)
user_type = models.CharField(default=1, choices=USER_TYPE, max_length=1)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
class Student(models.Model):
admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
gender = models.CharField(max_length=1, choices=GENDER)
address = models.TextField()
profile_pic = models.ImageField(upload_to='media')
session_start_year = models.DateField(null=True)
session_end_year = models.DateField(null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)
在我的views.py,我尝试过:
user = CustomUser.objects.create_user(email=email, password=password, user_type=3, first_name=first_name, last_name=last_name)
Run Code Online (Sandbox Code Playgroud)
但我的create_user() 缺少 1 个必需的位置参数:'用户名' 我该如何解决这个问题?
django ×9
python ×5
django-admin ×2
django-1.6 ×1
django-forms ×1
django-users ×1
login ×1
signals ×1
wagtail ×1