如何在Django中从表单或数据库获取用户id?

如何在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']

我在Django中有一个简单的login.html表单。我从登录表单中获取用户名和密码,并在Django视图中进行验证:

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中,并在那里进行哈希运算。