使用自定义字段扩展User模型(与Django的身份验证应用程序捆绑在一起)的最佳方法是什么?我也可能希望使用该电子邮件作为用户名(用于身份验证).
使用AbstractUser和AbstractBaseUser看起来非常相似.
from django.contrib.auth.models import AbstractUser, AbstractBaseUser
Run Code Online (Sandbox Code Playgroud)
两者有什么区别?
我想创建一个身份验证后端,允许用户只使用他们的电子邮件log_in(没有用户名,没有密码).
这是我试过的.
backends.py:
from django.conf import settings
from django.contrib.auth.models import User
class EmailAuthBackend(object):
def authenticate(self, username=None, password=None):
try:
user = User.objects.get(email=username)
if user:
return user
except User.DoesNotExist:
return None
Run Code Online (Sandbox Code Playgroud)
settings.py:
AUTHENTICATION_BACKENDS = (
'path_to.backends.EmailAuthBackend',
'django.contrib.auth.backends.ModelBackend',
)
Run Code Online (Sandbox Code Playgroud)
HTML:
<form method="post" action="{% url myproject.views.test %}">
{% csrf_token %}
<input type="text" name="email" value=""/>
<button type="submit">Valider</button>
</form>
Run Code Online (Sandbox Code Playgroud)
视图:
def test(request):
email = ''
if 'email' in request.POST:
email = request.POST.get('email')
if not User.objects.filter(email=email):
User.objects.create(email=email)
user = authenticate(username=email)
if user is not None:
if user.is_active: …Run Code Online (Sandbox Code Playgroud) 我正在学习 Django,需要一些帮助。
我需要在我的用户模型中包含一个额外的布尔字段(我相信数据库中的 auth_user 表),并在管理用户时将其显示在管理界面中,例如此图像中的员工状态字段...
127:0.0.1:8000/管理员/用户:
和...
127.0.0.1:8000/admin/auth/user/2/change/ :
我不确定如何处理这个问题。我知道我必须扩展 AbstractUser 模型,然后可能手动将该字段添加到数据库中,但是如何更新管理界面的视图、表单和模板的新字段?我是否必须为所有这些重写 django 管理源代码,还是有更简单的方法?
我看过很多解决方案,但似乎没有一个能回答问题。
我的用户模型现在正在使用 AbstractUser。有没有办法让用户名(unique = False)
因为我想让用户能够重复使用相同的用户名,因为我使用的登录是通过电子邮件地址和密码
下面是我尝试过但不起作用的代码。
代码:
class MyUser(AbstractUser):
username = models.CharField(max_length=30, unique=False)
Run Code Online (Sandbox Code Playgroud)
错误:
customuser.MyUser: (auth.E003) 'MyUser.username' must be unique because it is named as the 'USERNAME_FI ELD'
我正在尝试在 Django 中使用电子邮件进行身份验证。换句话说,我正在扩展 django 身份验证。我遵循了所有步骤,相信我它以前是有效的。现在它停止工作了。
从 django.db 导入模型
从 django.contrib.auth.models 导入 AbstractBaseUser,BaseUserManager,PermissionsMixin
从 django.core.mail 导入 send_mail
从 django.utils.translation 导入 ugettext_lazy as _
#now=time.strftime('%Y-%M-%D %H:%m:%S.%u%Z')
导入日期时间
从日期时间导入时间增量
从 django.utils 导入时区
立即从 django.utils.timezone 导入
明天 = timezone.now() + timedelta(天=1)
current_time=时区.now()
类 CustomUserManager(BaseUserManager):
def _create_user(自我,电子邮件,密码,is_staff,is_superuser,**额外_字段):
如果没有电子邮件:
raise ValueError('必须设置给定的电子邮件')
电子邮件= self.normalize_email(电子邮件)
用户= self.model(电子邮件=电子邮件,
is_staff=is_staff,
is_active = True,
is_superuser=is_superuser,
最后登录=时区.now(),
date_joined=timezone.now(),
**额外字段)
用户.set_password(密码)
user.save(using=self._db)
返回用户
def create_user(self, email,password=None,**extra_fields):
返回 self._create_user(电子邮件、密码、False、False、**extra_fields)
def create_superuser(自我、电子邮件、密码、**额外字段):
返回 self._create_user(电子邮件、密码、True、True、**extra_fields)
类 CustomUser(AbstractBaseUser,PermissionsMixin):
用户名 =models.CharField(max_length =255, unique = True,blank = True,null= … 我正在工作一个类似于网站的 CMS(内容管理系统)的项目。我正在用 django python 开发这个系统。但我是 Django python 的新手。
我有自己的用户模型(不是 django 用户模型),其中包含一些字段,如用户名、电子邮件、密码等,我从自己的管理面板创建新用户。
如何将加密密码与登录页面上发布的用户密码进行比较。
例如,我第一次创建用户时,123 的密码保存在 db 中,如 pbkdf2_sha24123$000asd$...之后我尝试使用密码 123 登录,但出现密码不相等的错误。
from django.contrib.auth.hashers import make_password
from account.models import myUsers
password = make_password(request.POST.get('password'))
email = request.POST.get('email')
if myUsers.password == password and myUsers.email == email:
#make login and redirect to panel
else:
#show error message
Run Code Online (Sandbox Code Playgroud)
我自己的模型喜欢;
class myUsers(models.Model):
username = models.CharField(max_length=25, verbose_name='username', unique=True)
email = models.CharField(max_length=225, verbose_name='email', unique=True)
password = models.CharField(max_length=225, verbose_name='password')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='created date')
secret_question = models.CharField(max_length=225, verbose_name='secret question')
secret_answer = …Run Code Online (Sandbox Code Playgroud) python django django-models login-control password-encryption
我希望我的Django项目使用他们的电子邮件而不是用户名来验证用户身份.我遵循了这个建议,但它不起作用.
这是我的 EmailBackend
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
class EmailBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwars):
UserModel = get_user_model()
try:
user = UserModel.objects.get(email=username)
except UserModel.DoesNotExist:
return None
else:
if user.check_password(password):
return user
return None
Run Code Online (Sandbox Code Playgroud)
我已经添加AUTHENTICATION_BACKENDS = ['GeneralApp.utils.EmailBackend']到settings.py中,当它被注释时,我可以使用用户名登录,当我取消注释它时,我再也无法登录了.我已经发现代码GeneralApp.utils.EmailBackend.authenticate()永远不会被执行,但我知道Django可以找到这个类,因为我故意拼错它并且我得到一个错误,当我纠正错字时,没有异常被提出.我也知道默认的身份验证后端是有效覆盖的,因为我不能用用户名登录.我有这个相同的解决方案在另一个项目中完美地工作,所以我无法理解为什么自定义的身份验证代码永远不会执行,当类完全定位AUTHENTICATION_BACKENDS设置为它.
有没有办法LANGUAGE_CODE在单击按钮(发送请求)时动态更改settings.py 中变量的值?
我希望用户为自己的帐户设置自己的"默认语言" .
现在,用户可以使用下拉列表选择他们的首选语言,并且网站被完美翻译,并且由于Django选择了浏览器的语言,用户在重新打开网站后不需要重新选择他们的语言浏览器.
但是当他们从不同的浏览器打开网站时,默认语言又是"英语",因为在settings.py中设置了LANGUAGE_CODE变量en-us.
所以我想要做的是让每个用户都可以选择他们想要的语言作为默认语言.我想通过制作另一个(类似的)下拉菜单并要求用户选择他们想要的语言作为"默认"并按下save按钮来执行此操作,并且在保存时,我想将LANGUAGE_CODE值更改为由用户(即动态更改).但我不知道如何LANGUAGE_CODE动态改变价值.
此外,这种方法还有一个问题.根据Django的文档,即使我能够LANGUAGE_CODE动态更改此变量,也会使网站将所选语言作为所有用户的默认语言,而不仅仅是针对那个更改它的特定用户:
LANGUAGE_CODE:
- 如果未使用区域设置中间件,则会决定向所有用户提供哪种翻译.
我研究了很多,但找不到适合我的解决方案.我对国际化很新.请帮忙.
我正在为一所学校创建一个 django 项目,主要有三种用户 - 家长、老师和学生。对于家长和老师,我希望他们使用电子邮件登录(他们目前使用电子邮件登录旧系统)。
但是,对于学生,我希望他们使用传统的用户名方法登录(因为年幼的孩子没有电子邮件)。这可以在 Django 中进行还是只允许一种用户身份验证模型?
我正在遵循 Django 登录教程,完成后我发现登录表单需要用户名和密码,但我想用用户的电子邮件替换用户名。
这是views.py
@login_required
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Your account has been created! You are now able to log in')
return redirect('login')
else:
form = UserRegisterForm()
return render(request, 'users/register.html', {'form': form})
@login_required
def profile(request):
if request.method == 'POST':
u_form = UserUpdateForm(request.POST, instance=request.user)
p_form = ProfileUpdateForm(request.POST,
request.FILES,
instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request, f'Your account has been updated!')
return redirect('profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = …Run Code Online (Sandbox Code Playgroud)