RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 999618
Accepted
Uncle_Ragnar
Uncle_Ragnar
Asked:2020-07-05 15:43:16 +0000 UTC2020-07-05 15:43:16 +0000 UTC 2020-07-05 15:43:16 +0000 UTC

Django 2.2 自定义用户模型(密码总是不匹配)

  • 772

创建自定义用户模型并在管理面板中注册新用户后!!!无法从网站登录,错误 -请输入正确的邮件和密码。两个地方都要注意大小写。

Python 3.7,Django 2.2,站点上不允许用户注册,只能从管理面板并且只能由管理员进行。

MOELS.PY

class UserManager(BaseUserManager):
def create_user(self, email, first_name=None, password=None, is_active=True, 
is_staff=False, is_admin=False):
    if not email:
        raise ValueError('Поле email должно быть заполнено')
    if not password:
        raise ValueError('Неверный пароль')

    user = self.model(
        email=self.normalize_email(email),
        first_name=first_name
    )

    user.set_password(password)
    user.staff = is_staff
    user.admin = is_admin
    user.active = is_active
    user.save(using=self._db)
    return user

def create_staffuser(self, email, first_name=None, password=None):
    user = self.create_user(
        email,
        first_name=first_name,
        password=password,
        is_staff=True
    )
    return user

def create_superuser(self, email, first_name=None, password=None):
    user = self.create_user(
        email,
        first_name=first_name,
        password=password,
        is_staff=True,
        is_admin=True
    )
    return user


class RealUser(AbstractBaseUser):
    first_name = models.CharField('Имя', max_length=120)
    last_name = models.CharField('Фамилия', max_length=120, db_index=True)
    patronymic = models.CharField('Отчество', max_length=120)
    phone_number = models.CharField('Телефон', max_length=15, unique=True)
    email = models.EmailField('Почта', max_length=30, unique=True)
    image = models.ImageField('Фото', default='user.png', upload_to='user_img')
    description = models.TextField('О себе', default='')
    department = models.ForeignKey(UserDepartment, on_delete=models.SET_NULL, null=True, verbose_name='Отдел')
    position = models.ForeignKey(UserPosition, on_delete=models.SET_NULL, null=True, verbose_name='Должность')
    status = models.ForeignKey(UserStatus, on_delete=models.SET_NULL, null=True, verbose_name='Статус')
    active = models.BooleanField('Работает', default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name']

    objects = UserManager()

    def __str__(self):
        return f'СОТРУДНИК: {self.first_name} {self.last_name}, ПОЧТА: {self.email}, ТЕЛЕФОН: {self.phone_number}'
        # return self.email

    def get_full_name(self):
        return f'{self.first_name} {self.last_name}, ПОЧТА: {self.email}'
        # return self.email

    def get_short_name(self):
        return f'{self.last_name}, ПОЧТА: {self.email}'
        # return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active

    def get_absolute_url(self):
        return reverse('employee_detail', args=[str(self.email)])

    class Meta:
        verbose_name = 'Сотрудник'
        verbose_name_plural = 'Сотрудники'

管理员

from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.contrib import admin
from django import forms
from .models import *

User = get_user_model()


class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Подтверждение паорля', widget=forms.PasswordInput)

    class Meta:
        model = RealUser
        fields = ('email', 'first_name',)

    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('Пароли не совпадают')

        return password2

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data['password1'])

        if commit:
            user.save()

        return user


class UserChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = RealUser
        fields = (
            'email',
            'password',
            'first_name',
            'trainee',
            'manager',
            'head',
            'staff',
            'admin',
        )

        def clean_password(self):
            return self.initial['password']


class UserAdmin(admin.ModelAdmin):
    search_fields = [
        'email',
        'last_name',
    ]

    list_filter = [
        'active',
        'head',
        'manager',
        'trainee',
        'staff',
    ]

    list_display = [
        'first_name',
        'last_name',
        'email',
        'phone_number',
        'active',
        'head',
        'manager',
        'trainee',
        'staff',
        'admin',
    ]

    class Meta:
        model = User


admin.site.register(UserDepartment)
admin.site.register(UserPosition)
admin.site.register(UserStatus)
admin.site.register(RealUser, UserAdmin)
admin.site.register(GuestUser)
admin.site.register(GuestUserStatus)

admin.site.unregister(Group)

登录.HTML

{% extends 'core/index.html' %}

{% block title %}
    Вход в личный кабинет
{% endblock %}

{% block content %}
    <h1>{{ user.first_name }}</h1>
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">
                    Log in
                </legend>
                {{ form.as_p }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">
                    Login
                </button>
            </div>
        </form>
    </div>
{% endblock %}

设置.py

***
AUTH_USER_MODEL = 'users.RealUser'
***

我注意到了这一刻(有些东西告诉我这就是问题所在)。如果您进入管理配置文件中的管理面板,则密码将以散列形式显示,并且以文本形式为用户显示: 管理屏幕

用户屏幕


ADMIN.PY(已更正)

class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Подтверждение паорля', widget=forms.PasswordInput)

    class Meta:
        model = RealUser
        fields = ('email', 'first_name',)

    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('Пароли не совпадают')

        return password2

    def save(self, *args, **kwargs):
        user = super().save(*args, **kwargs)
        user.set_password(self.cleaned_data['password1'])
        user.save()

        return user
python-3.x
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Za Ars
    2020-07-05T17:05:04Z2020-07-05T17:05:04Z

    您的问题是您仅在 commit==True 时保存用户

            user = super().save(commit=False)
            user.set_password(self.cleaned_data['password1']) 
    
            if commit: # Не работает из-за этого. Уберите и будет счастье. Почему - см. ниже
                user.save()
    

    更新到

    
        def save(self, *args, **kwargs):
            user = super().save(*args, **kwargs)
            user.set_password(self.cleaned_data['password1'])
            user.save()
    

    模型管理员

    # django.contrib.admin.options.ModelAdmin
    # 969 строка
    
        def save_form(self, request, form, change):
            """
            Given a ModelForm return an unsaved instance. ``change`` is True if
            the object is being changed, and False if it's being added.
            """
            return form.save(commit=False)
    
    
    • 1

相关问题

  • 如何将长数转换为字节数组?

  • Schnorr方案中的快速密钥生成算法

  • 如何使用在 Keras 生成器上训练的神经网络?

  • 如何在 tkinter 库中为 python 编程语言中的按钮制作不同的字体?

  • 通过 selenium webdriver 在打开的浏览器中删除通知窗口

  • 编写一个函数,找出所有 5 位数字等于输入值的数字之和

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5