【问题标题】:Password error when customizing Django authentication自定义 Django 身份验证时出现密码错误
【发布时间】:2019-05-07 22:09:03
【问题描述】:

我正在尝试使用已创建的 Mysql 表(合作者)自定义 Django 中默认提供的身份验证。 当我想注册一个用户(使用command python manage.py createsuperuser)时,我收到以下错误:

django.db.utils.OperationalError: (1054, "Unknown column 'collaborators.password' in 'field list'").

那个错误提到密码列不存在,而且我确实没有在表中,有没有办法表明密码是从名为contrasena_general的列中获取的? 我附上我的代码。

models.py

class MyUserManager(BaseUserManager):
    use_in_migrations = True

    def create_superuser(self, no_colaborador, nombres_colaborador, apellido_paterno_colaborador, apellido_materno_colaborador,
                        id_plantel, id_area_colaborador, no_empleado_sup, contrasena_general, empleado_interno):

        user = self.model(no_colaborador = no_colaborador, nombres_colaborador = nombres_colaborador, 
            apellido_paterno_colaborador = apellido_paterno_colaborador, apellido_materno_colaborador = apellido_materno_colaborador,
            id_plantel = id_plantel, id_area_colaborador = id_area_colaborador, no_empleado_sup = no_empleado_sup, 
            contrasena_general = contrasena_general, empleado_interno = empleado_interno,)
        user.set_password(contrasena_general)
        user.save(using=self._db)
        return user

class Colaboradores(AbstractBaseUser):
    no_colaborador = models.IntegerField(primary_key=True)
    nombres_colaborador = models.CharField(max_length=150)
    apellido_paterno_colaborador = models.CharField(max_length=150)
    apellido_materno_colaborador = models.CharField(max_length=150)
    id_plantel = models.IntegerField()
    id_area_colaborador = models.IntegerField()
    id_centro_costos = models.IntegerField()
    no_empleado_sup = models.IntegerField()
    contrasena_general = models.CharField(max_length=100)
    empleado_interno = models.CharField(max_length=10)

    objects = MyUserManager()

    USERNAME_FIELD = "no_colaborador"

    class Meta:
        managed = False
        db_table = 'collaborators'
        app_label = "journal"

    def __str__ (self): 
        return self.email 

    def def_full_name (self): 
        return self.nombres_colaborador

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

    def has_module_perms(self, app_label):
        return self.no_colaborador
# backends.py

class MyAuthBackend(object):
    def authenticate(self, no_colaborador, contrasena_general):    
        try:
            user = Colaboradores.objects.get(no_colaborador=no_colaborador)
            if user.check_password(contrasena_general):
                return user
            else:
                return None
        except Colaboradores.DoesNotExist:
            logging.getLogger("error_logger").error("user with login %s does not exists " % login)
            return None
        except Exception as e:
            logging.getLogger("error_logger").error(repr(e))
            return None

    def get_user(self, no_colaborador):
        try:
            user = Colaboradores.objects.get(no_colaborador=no_colaborador)
            if user.is_active:
                return user
            return None
        except Colaboradores.DoesNotExist:
            logging.getLogger("error_logger").error("user with %(no_colaborador)d not found")
            return None
# setting.py
...
AUTH_USER_MODEL = 'journal.Colaboradores'
AUTHENTICATION_BACKENDS = ('clientes.backends.MyAuthBackend', 'django.contrib.auth.backends.ModelBackend',)

你怎么能指出密码是从表中不称为密码的列中获得的?

【问题讨论】:

    标签: django django-authentication


    【解决方案1】:

    我认为创建自己的createsuperuser 命令可以解决这个问题。

    参考:Is it possible to make my own createsuperuser command in django?

    您可以在 Github 上找到 Django's createsuperuser 的原始源代码。

    从那里可以看出,第 20 行有一个常量:

    PASSWORD_FIELD = 'password'
    

    所以我猜既然你在模型中把它改成了contrasena_general,你需要自己做个自定义命令。

    【讨论】:

    • 感谢您的回答,但即使PASWORD_FIELD = "contrasena_general" 不起作用,它仍然会产生相同的错误。
    • 你确定没有错字吗?你写的是PASWORD_FIELD 而不是PASSWORD_FIELD(只是为了确保)。
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多