如何在Django中从表单或数据库获取用户id?
我在Django中有一个简单的login.html表单。我从登录表单中获取用户名和密码,并在Django视图中进行验证:如何在Django中从表单或数据库获取用户id?,django,Django,我在Django中有一个简单的login.html表单。我从登录表单中获取用户名和密码,并在Django视图中进行验证: def login_upload(request): if request.method == 'POST': username = request.POST['username'] username1 = ''.join(username) password = request.POST['password']
def login_upload(request):
if request.method == 'POST':
username = request.POST['username']
username1 = ''.join(username)
password = request.POST['password']
password = ''.join(password)
password1 = hashlib.sha1(password).hexdigest()
user = authenticate(username=username1, password=password1)
user_id = request.galaxyuser.id
if len(user) > 0:
return render_to_response('right.html', {'user_id':user_id}, context_instance=RequestContext(request))
else:
return render_to_response('wrong.html', context_instance=RequestContext(request))
else:
return render_to_response('login.html', context_instance=RequestContext(request))
我还想获得我以后必须使用的用户id。我尝试使用:
user_id = request.galaxyuser.id
但它返回None
值。这是我的模型.py:
class GalaxyUser(models.Model):
id = models.IntegerField(primary_key=True)
create_time = models.DateTimeField(null=True, blank=True)
update_time = models.DateTimeField(null=True, blank=True)
email = models.CharField(max_length=765)
password = models.CharField(max_length=120)
external = models.IntegerField(null=True, blank=True)
deleted = models.IntegerField(null=True, blank=True)
purged = models.IntegerField(null=True, blank=True)
username = models.CharField(max_length=765, blank=True)
form_values_id = models.IntegerField(null=True, blank=True)
disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True)
class Meta:
db_table = u'galaxy_user'
编辑:
我的自定义身份验证功能:
def authenticate(username='username', password='password'):
return GalaxyUser.objects.filter(username=username, password=password)
我不知道request.galaxyuser应该是什么,但是给定一个user对象,id是该对象的一个属性。如果凭据有效,
authenticate
函数应该返回一个用户对象
user = authenticate(username=username1, password=password1)
user_id = request.galaxyuser.id # what are you doing here?
user_id = user.id # this is the user ID.
这个问题可能有不同的答案,这取决于您如何实现自定义User
类。我假设它是authenticate
返回的类
更新:
您的示例显示返回一个QuerySet
(a.filter
)行列表
您需要返回一个对象以便查找ID属性,或者需要修改视图以解释这种奇怪的行为。Authenticate应该返回经过身份验证的用户对象,因此我将使用前者
def authenticate(.....):
try:
return GalaxyUser.objects.get(username=username, password=password)
except GalaxyUser.DoesNotExist:
return None
user = authenticate(...)
user_id = user.id
galaxyuser是模型的名称,我正试图从galaxyuser模型中检索id属性。@user1881957,为什么它会出现在请求对象上?您是否编写了一些自定义中间件?
authenticate
返回的user
对象不是您要查找的用户吗?不,我没有。我想是的。存储明文密码是个坏主意,但有两件事:返回QuerySet
。您可能应该返回单个对象(通过get
)。但说真的,明文密码=坏主意。您应该研究默认密码机制,了解如何存储/比较安全密码。@user1881957。是的。这毫无意义。如何验证一个用户/通过并返回多个用户?如何从多个用户处获取用户id
?如果您的意思是user\u id
,那么根据您对Tomita的评论,您似乎对数据库查询的工作方式有着完全奇怪的理解。正如他所说,您需要使用get
。这将返回一个匹配的实例。另外,您不应该在登录函数中进行哈希运算,而是将未加密的密码传递到authenticate中,并在那里进行哈希运算。