27

我得到了以下错误消息,

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

在执行以下表格时。


视图.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
                    )

但我不知道如何解决它。我该如何解决?

4

6 回答 6

57

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

于 2013-04-08T12:58:36.900 回答
11

在 localhost 上运行这段代码时,您必须登录。否则request.user将是 a SimpleLazyObject,那么错误就会出现。

于 2013-11-11T14:36:24.660 回答
9

Here you trying to create a Bookmark object based on request.user , but request.user is a SimpleLazyObject , so we can get a more secure user object by :

from django.contrib import auth

current_user = auth.get_user(request)

and further your query should be

bookmark, created = Bookmark.objects.get_or_create(
                    user=current_user,
                    link=link
                    )
于 2014-04-15T11:33:54.180 回答
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

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

def bookmark_save_page(request):
    if request.method == 'POST' and request.user.is_authenticated():
        form = BookmarkSaveForm(request.POST)
        if form.is_valid():
            # Do something
于 2014-09-15T22:25:34.143 回答
1

那很奇怪,我有同样的问题和相同的解决方案。在尝试了一堆替代方案后,我回到了 user = request.user 并且它起作用了

于 2013-09-03T17:52:05.110 回答
0

如果你想设置一个添加请求属性,基于user-> 你需要使用lazy正确处理的 Django 函数Field.get_prep_value

   from django.utils.functional import lazy
   request.impersonator = lazy(lambda: request.user.id, int)()
于 2022-02-21T13:14:46.543 回答