【问题标题】:Django request.user Not Resolving SimpleLazyObjectDjango request.user 无法解析 SimpleLazyObject
【发布时间】:2023-03-09 15:20:01
【问题描述】:

我的 Django 应用程序中有一个方法,它使用用户 ID 来查找对象。此方法通过 AJAX 调用调用。当登录到有效的用户帐户时,无论我尝试什么,request.user 都会评估为 django.utils.functional.SimpleLazyObject 对象并且无法检索我想要的数据(SkillEntry 匹配查询不存在当它绝对确实存在)。我尝试了Django: Filtering drafts by user causes error中的解决方案,但无济于事。

如何让用户引用用户对象的实际实例?

查看代码:

@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)

【问题讨论】:

  • 试试entry = SkillEntry.objects.get(user=user, skill=skill),而不是使用user.pk

标签: javascript python ajax django django-views


【解决方案1】:

正如rohan所说,您不必使用user.pk

更改此查询

entry = SkillEntry.objects.get(user=user.pk, skill=skill) 

    entry = SkillEntry.objects.get(user=user, skill=skill) 

如果它不起作用,请分享您的 models.py

【讨论】:

  • 感谢您的建议。这就是我最初尝试的方法,但没有奏效。将模型添加到原始帖子中。
  • 你得到的错误是那个查询返回任何东西
猜你喜欢
  • 2013-07-11
  • 2019-07-19
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
相关资源
最近更新 更多