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应解决您的问题.
小智 11
在localhost上运行这段代码时必须登录.否则request.user将是a SimpleLazyObject,然后出错.
在这里,您尝试基于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)
很可能是加载页面的用户未经过身份验证.因此抛出了错误.如果要将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)
| 归档时间: |
|
| 查看次数: |
33337 次 |
| 最近记录: |