繁体   English   中英

Django-ValidationError“值必须为整数”

[英]Django - ValidationError “value must be an integer”

我正在从旧项目(Django 1.7)中回收部分代码,以在新项目(Django 1.8)中使用它,所以每次我要登录时都会收到此错误消息

在此处输入图片说明

在Django 1.7中运作良好

对于我的模型,我正在使用AbstractBaseUser

models.py

class Student(AbstractBaseUser, models.Model):
    email = models.EmailField(max_length=50)
    user_id = models.CharField(max_length=8, null=False, editable=False, default=id_generator, primary_key=True)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    prom_code = models.CharField(max_length=8, null=False, default="")
    gender = (("M","Male"),("F","Female"),)
    gender = models.CharField(max_length=1, choices=gender, default="M", null=False)
    USERNAME_FIELD = 'email'

    @property
    def is_superuser(self):
        return False

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

    def has_module_perms(self, app_label):
        return False

    @property
    def is_staff(self):
        return False

    def save(self, **kwargs):
        if not self.user_id:
            self.user_id = id_generator()
            while Student.objects.filter(user_id = self.user_id).exists():
                self.user_id = id_generator()

        super(Student, self).save() 

我进行了自定义身份验证

auth_backend.py

from registration_app.models import Student
import md5    


class ClientAuthBackend(object):

    def authenticate(self, username=None, password=None):
        try:
            user = Student.objects.get(email=username)
            password_ver = md5.new(password).hexdigest()        
            if user.check_password(password_ver):
                return user
            else:
                print("Entre aqui")
                return None
        except Student.DoesNotExist:
            print("Entre aqui2")
            return None

    def get_user(self, user_id):
        try:
            user = Student.objects.get(user_id=user_id)
            if user is not None:
                return user
        except Student.DoesNotExist:
            return None

views.py

def user_login(request):
    args = {}
    form = LoginForm(request.POST)
    username = request.POST.get('email', '')
    password = request.POST.get('password', '')
    user = authenticate(username=username, password=password)

    if user is not None:
        print user.first_name + " ah iniciado session"
        login(request, user) #-----**Here is where i get the problem**-----
        return HttpResponseRedirect('/user/')
    else:
        print("El usuario no existe")

    args['form'] = form
    return render(request, 'user_student/login.html', args)

在我的命令提示符下,我实际上可以看到该用户已登录(这给我带来了用户名)

根据Django文档:

Django管理员与Django User对象紧密耦合。 解决此问题的最佳方法是为后端存在的每个用户(例如,在LDAP目录,外部SQL数据库等中)创建一个Django User对象。您可以预先编写脚本来执行此操作,或您的authenticate方法可以在用户首次登录时执行此操作。

https://docs.djangoproject.com/zh-CN/1.11/topics/auth/customizing/

发生的情况是您为用户拥有非数字PK ,而Django不喜欢这样。 我有同样的问题。

如文档中所述,您应该为每个身份验证创建一个用户 (如果尚不存在),并将ClientAuthBackend中get_user方法更改回:

def get_user(self, user_id):
    try:
        return User.objects.get(pk=user_id)
    except User.DoesNotExist:
        return None

在我更改了它之后,一切都顺利进行了。

此错误来自您的Django会话。 我用解决了

- python manage.py shell

在贝壳上,我跑了

> from django.contrib.sessions.models import Session
> Session.objects.all().delete()

您可以通过运行来检查创建的会话

Assuming the userid = '2b1189a188b44ad18c35e113ac6ceead'
s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead')

您可以在此处了解有关会话的更多信息

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM