int()参数必须是字符串或数字,而不是'SimpleLazyObject'

时间:2013-04-08 12:19:10

标签: django django-views

我收到了错误消息,

  

/ save / int()参数中的TypeError必须是字符串或数字,而不是   'SimpleLazyObject'

执行以下表格时。


views.py

def bookmark_save_page(request):
    if request.method == 'POST':
        form = BookmarkSaveForm(request.POST)
        if form.is_valid():
            # create or get link
            link, dummy = Link.objects.get_or_create(
                    url = form.cleaned_data['url']
                    )
            # create or get bookmark
            bookmark, created = Bookmark.objects.get_or_create(
                    user=request.user,
                    link=link
                    )
            # update bookmarks title
            bookmarks.title = form.cleaned_data['title']
            # if the bookmark is being updated, clear old tag list.
            if not created:
                bookmark.tag_set.clear()
            # create new tag list
            tag_names = form.cleaned_data['tags'].split()
            for tag_name in tag_names:
                tag, dummy = Tag.objects.get_or_create(name=tag_name)
                bookmark.tag_set.add(tag)
            # save bookmark to database.
            bookmark.save()
            return HttpResponseRedirect(
                    '/user/%s/' % request.user.username
                    )
    else:
        form = BookmarkSaveForm()
    variables = RequestContext(request, {
        'form': form
    })
    return render_to_response('bookmark_save.html', variables)

我以为我收到了错误,因为我在

处通过了链接
bookmark, created = Bookmark.objects.get_or_create(
                    user=request.user,
                    link=link
                    )

但我无法弄清楚如何解决它。 我该如何解决?

5 个答案:

答案 0 :(得分:53)

可能的原因是您正在设置user = request.user,其中request.user不是真正的User对象,而是SimpleLazyObject实例。有关详细信息,请参阅django: Purpose of django.utils.functional.SimpleLazyObject?,但使用request.user.id可以解决您的问题。

答案 1 :(得分:11)

在localhost上运行这段代码时必须登录。否则request.user将是SimpleLazyObject,然后就会出错。

答案 2 :(得分:9)

在这里,您尝试基于request.user创建Bookmark对象,但request.user是SimpleLazyObject,因此我们可以通过以下方式获得更安全的用户对象:

from django.contrib import auth

current_user = auth.get_user(request)

并且您的查询应该是

bookmark, created = Bookmark.objects.get_or_create(
                    user=current_user,
                    link=link
                    )

答案 3 :(得分:5)

加载页面的用户很可能未经过身份验证。因此抛出了错误。如果要将request.user引用保存到数据库,则显然必须确保只有经过身份验证的用户才能调用该函数。

在您的情况下,有两种可能性 - 将“@login_required”装饰器添加到该函数或检查用户是否在代码中进行了身份验证。以下是片段:

使用装饰器:

from django.contrib.auth.decorators import login_required

@login_required
def bookmark_save_page(request):
    if request.method == 'POST':
        form = BookmarkSaveForm(request.POST)
        if form.is_valid():
            # Do something

OR - 如果用户经过身份验证,则在代码内部进行检查:

def bookmark_save_page(request):
    if request.method == 'POST' and request.user.is_authenticated():
        form = BookmarkSaveForm(request.POST)
        if form.is_valid():
            # Do something

答案 4 :(得分:1)

多奇怪,我有同样的问题和相同的解决方案。在尝试了一堆替代方案之后,我又回到了user = request.user,它运行了