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

yup*_*yup 27 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)
Run Code Online (Sandbox Code Playgroud)

我以为我得到了错误,因为我通过了链接

bookmark, created = Bookmark.objects.get_or_create(
                    user=request.user,
                    link=link
                    )
Run Code Online (Sandbox Code Playgroud)

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

Mar*_* B. 54

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

  • 谢谢!但我仍然有错误...无法分配"1":"Bookmark.user"必须是"用户"实例. (2认同)

小智 11

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

  • 如果您有一个尝试在数据库中查找`request.user`的视图,并且您忘记添加`login_required`装饰器,并且您尝试访问该视图而未登录,则会发生这种情况. (3认同)

Vid*_*gar 9

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

from django.contrib import auth

current_user = auth.get_user(request)
Run Code Online (Sandbox Code Playgroud)

进一步你的查询应该是

bookmark, created = Bookmark.objects.get_or_create(
                    user=current_user,
                    link=link
                    )
Run Code Online (Sandbox Code Playgroud)


dh1*_*1tw 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
Run Code Online (Sandbox Code Playgroud)

或者 - 如果用户通过身份验证,则检查代码内部:

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