Параметр int() должен быть строкой или числом, а не "SimpleLazyObject"
Я получил следующие сообщения об ошибках
Аргумент TypeError at/save/int() должен быть строкой или числом, а не '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
)
Но я не могу понять, как это исправить.
Как я могу это исправить?
Ответы
Ответ 1
Вероятная причина заключается в том, что вы устанавливаете user = request.user
, где request.user не является реальным объектом User, а экземпляром SimpleLazyObject. Подробнее см. django: Цель django.utils.functional.SimpleLazyObject?, но с помощью request.user.id
следует исправить вашу проблему.
Ответ 2
Вам нужно войти в систему при запуске этой части кода на localhost. В противном случае request.user
будет SimpleLazyObject
, тогда ошибки появятся.
Ответ 3
Здесь вы пытаетесь создать объект Bookmark на основе request.user, но 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
)
Ответ 4
Скорее всего, пользователь, который загружает страницу, не аутентифицирован. Для этого возникает ошибка. Если вы хотите сохранить ссылку 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
Ответ 5
Это странно, у меня была та же проблема и такое же решение. Попробовав кучу альтернатив, я вернулся к user = request.user, и он работал