我收到了错误消息,
/ 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
)
但我无法弄清楚如何解决它。 我该如何解决?
答案 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,它运行了