Django request.user 无法解析 SimpleLazyObject
我在我的Django应用中有一个方法,它通过用户ID来查找一个对象。这个方法是通过AJAX调用的。当我登录到一个有效的用户账户时,无论我怎么尝试,request.user
的结果都是一个django.utils.functional.SimpleLazyObject
对象,这导致我无法获取我想要的数据(出现了SkillEntry匹配的查询不存在的错误,尽管它实际上是存在的)。我尝试了Django:按用户过滤草稿导致错误中的解决方案,但没有成功。
我该如何让用户指向一个实际的用户对象实例呢?
视图代码:
@login_required
def skill_set(request, name):
skill = Skill.objects.get(slug=name) # Found.
level = 0
user = request.user
if request.method == 'POST':
if user.is_authenticated():
entry = SkillEntry.objects.get(user=user.pk, skill=skill) # Not found.
entry.level = request.POST['level']
entry.save()
return HttpResponse(status=200)
else:
return HttpResponseForbidden()
JavaScript客户端代码:
function setSkill(skill, value) {
var req = new XMLHttpRequest();
req.open("POST", "/skill/" + skill + "/set/", true);
csrftoken = getCookie('csrftoken');
req.setRequestHeader("X-CSRFToken", csrftoken);
req.send('level=' + value);
var elem = document.getElementById('level');
elem.innerHTML = "My skill level is " + value + ".";
}
我是不是需要在请求中设置什么东西来保持会话信息?我可以发誓我在Django的早期版本中成功做过类似的事情。我现在使用的是1.4.3版本。
编辑:
以下是我在models.py中的模型定义:
class Skill(models.Model):
name = models.CharField(max_length=100)
slug = models.CharField(max_length=100, blank=True)
keywords = models.CharField(max_length=120, blank=True, help_text='List of additional keywords this skill should show up for in search')
description = models.TextField(null=True, blank=True)
parent = models.ForeignKey('Skill', null=True, blank=True, help_text='Parent skill. Leave blank if this is a root category.')
def save(self, *args, **kwargs):
if not self.id:
self.slug = slugify(self.name)
super(Skill, self).save(*args, **kwargs)
def __unicode__(self):
return self.name
class Meta:
ordering = ('name',)
class SkillEntry(models.Model):
skill = models.ForeignKey('Skill')
level = models.IntegerField()
user = models.ForeignKey(User)
last_updated = models.DateField(auto_now=True)
class Meta:
verbose_name_plural = 'Skill Entries'
ordering = ('skill__name',)
def __unicode__(self):
return self.user.username + ' knows ' + self.skill.name + ' at level ' + str(self.level)
1 个回答
0
正如rohan所说,你不需要使用 user.pk
。
把这个查询改成:
entry = SkillEntry.objects.get(user=user.pk, skill=skill)
改成:
entry = SkillEntry.objects.get(user=user, skill=skill)
如果还是不行,请分享一下你的models.py文件。