我正在扩展django中的用户模型,因为原始密码我无法进行身份验证

时间:2012-04-09 18:26:02

标签: django django-authentication

所以问题是我在django中扩展了用户模型。我已经为它写了一些看法。 这是我的模型代码: -

class StudentProfile(User):
    batch = models.CharField(max_length=10)
    course = models.CharField(max_length=20)
    date_of_birth = models.DateField()
    answer = models.CharField(max_length=20)
    contact = models.CharField(max_length=20)

这是我的身份验证后端文件: -

来自quizapp.models的

导入StudentProfile

class StudentAuthenticationBackend(object):
    def authenticate(self, username=None, password=None):
        try:
            student = StudentProfile.objects.get(username=username)
            if student.check_password(password):
                return student
        except StudentProfile.DoesNotExist:
            pass

        return None

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

我已经在seetings.py中进行了更改

AUTHENTICATION_BACKENDS = (
    'quizapp.backends.StudentAuthenticationBackend',
    'django.contrib.auth.backends.ModelBackend',
)

我正在打印用户名,密码和身份验证用户。这就是我得到的: -

使用django时创建的超级用户

>> a = authenticate(username="super",password="super")
>> print(a)
>> super

但是当使用由表单创建的用户时,

>> b = authenticate(username="test",password="123")
>> print(b)
>> None

我已经交叉检查了用户名和密码,这是真的。 所以在auth_user表中,username是super,密码是加密的,但对于测试用户,username是user,密码是123。

所以问题一定是django正在使用123加密密码并使用其解密版本进行身份验证。

有什么方法可以解决这个问题吗?

我使用过OneToOneField并在StudentProfile模型中添加了额外的字段。现在我正在使用表单并向其注册用户。

这是视图代码: -

def register_page(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
            if form.is_valid():
                user = StudentProfile.objects.create(
                  username=form.cleaned_data['username'],
                  password=form.cleaned_data['password1'],
                  batch=form.cleaned_data['batch'],
                  first_name=form.cleaned_data['first_name'],
                  last_name=form.cleaned_data['last_name'],
                  course=form.cleaned_data['course'],
                  date_of_birth=form.cleaned_data['date_of_birth'],
                  secret_question=form.cleaned_data['secret_question'],
                  answer=form.cleaned_data['answer'],
                  contact=form.cleaned_data['contact']
                 )
                return HttpResponseRedirect('/register/success/')
   else:
       form = RegistrationForm()

     variables = RequestContext(request, {'form': form})
     return render_to_response('registration/register.html',variables)

我在/ register /得到IntegrityError 列“user_id”中的空值违反了非空约束错误。 有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

来自storing additional information about users上的Django身份验证文档部分:

  

如果您想存储与您的用户相关的其他信息,Django提供了一种方法来指定特定于站点的相关模型 - 称为“用户配置文件” - 用于此目的。

     

要使用此功能,请定义一个模型,其中包含您要存储的其他信息的字段,或者您希望提供的其他方法,还要添加名为{{1}的OneToOneField从您的模型到user模型。这样可以确保只为每个User创建一个模型实例。

所以你根本不应该继承User - 这就是问题的根源。相反,您应该创建另一个与User具有一对一关系的模型,并在那里添加您的字段。