Подтвердить что ты не робот

Параметр 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
                    )

Но я не могу понять, как это исправить. Как я могу это исправить?

4b9b3361

Ответ 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, и он работал