2

所以问题是我在 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 表中,用户名是超级用户,密码是加密的,但是对于测试用户,用户名是用户,密码是 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)

而且我在“user_id”列中的 /register/ null 值处收到 IntegrityError 违反了非空约束错误。有没有什么办法解决这一问题?

4

1 回答 1

2

从关于存储有关用户的其他信息的 Django 身份验证文档部分:

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

要使用此功能,请定义一个模型,其中包含您想要存储的其他信息或您想要使用的其他方法的字段,并将模型中的OneToOneField命名添加userUser模型中。这将确保只能为每个User.

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

于 2012-04-09T18:32:57.560 回答