我有一个用于存储登录详细信息的自定义模型:
class UserRegistration(models.Model):
# Auto updated when data is inserted
created_at = models.DateTimeField(auto_now_add=True, auto_now=False)
# Auto updated when data is altered
updated_at = models.DateTimeField(auto_now_add=False, auto_now=True)
username = models.CharField(max_length=255, null=True)
password = models.CharField(max_length=255, null=True)
first_name = models.CharField(max_length=255, null=True)
last_name = models.CharField(max_length=255, null=True)
def __str__(self):
return self.first_name
urls.py是
url(r'^login/$', view.login_page, name='login_page'),
views.py是
def login_page(request):
if request.method == 'GET':
return render(request, "login_page.html")
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
print username, password
credentials_matches = False # considering credentials are wrong
all_users = UserRegistration.objects.all()
for user in all_users:
if user.username == username and user.password == password:
credentials_matches = True
break
if credentials_matches:
return HttpResponse('success')
# return redirect("http://127.0.0.1:8000/lmtech")
else:
return HttpResponse('fail')
我还有其他视图,如果他们尚未登录,则不希望显示给用户。我虽然使用@login_required(),但在这种情况下,用户详细信息位于自定义模型中。我该如何解决这个问题?
答案 0 :(得分:1)
您绝对不能建立这样的自定义用户模型。编写自己的身份验证系统始终是不安全的。
您应该使用标准的内置身份验证框架-您可以替换自己的用户模型,但是它必须继承自AbstractBaseUser,请参见the docs。但是,由于您没有添加任何自定义功能,因此似乎没有太多理由这样做。
答案 1 :(得分:0)
在您的自定义模型上,您需要名字,姓氏,名称,用户名和密码,在来自django的用户模型中,您只有更多电子邮件,这是可选的。因此,您可以做的是使用Django模型创建一个User,然后使用一种关系来拥有您想要的其他两个属性。
这是一个例子
class User(models.Model):
username = models.CharField()
password
...
class UserMore(models.Model):
user = models.OneToOneField(User)
created_at = ...
updated_at = ...
def __str__(self):
return self.user.username
在这种情况下,您可以使用django的@login_required()
。
性格,这就是我的方式。
但是,如果您真的想保留自定义模型而不使用Django的User模型,则可以将用户保留在您在登录视图中启动的会话中,然后在注销时将其删除。这样,您可以轻松检查request.session['username']
是否已定义。