所以问题是我在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”中的空值违反了非空约束错误。 有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
来自storing additional information about users上的Django身份验证文档部分:
如果您想存储与您的用户相关的其他信息,Django提供了一种方法来指定特定于站点的相关模型 - 称为“用户配置文件” - 用于此目的。
要使用此功能,请定义一个模型,其中包含您要存储的其他信息的字段,或者您希望提供的其他方法,还要添加名为{{1}的
OneToOneField
从您的模型到user
模型。这样可以确保只为每个User
创建一个模型实例。
所以你根本不应该继承User
- 这就是问题的根源。相反,您应该创建另一个与User
具有一对一关系的模型,并在那里添加您的字段。