[Django]-Int() argument must be a string or a number, not 'SimpleLazyObject'

57👍

The likely cause is that you’re setting user = request.user, where request.user is not a real User object, but a SimpleLazyObject instance. See django: Purpose of django.utils.functional.SimpleLazyObject? for more details, but using request.user.id should fix your issue.

11👍

You have to login when running this piece of code on localhost. Otherwise the request.user will be a SimpleLazyObject, then the errors comes out.

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
                    )

5👍

Most likely the user who is loading the page is not authenticated. Therefor the error is thrown. If you want to save a request.user reference to the database, you obviously have to ensure that only authenticated users are able to call the function.

In your case there are two possibilities – add the “@login_required” decorator to the function or check if the user is authenticated inside the code. Here are the snippets:

With Decorator:

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 – checking inside the code if the user is authenticated:

def bookmark_save_page(request):
    if request.method == 'POST' and request.user.is_authenticated():
        form = BookmarkSaveForm(request.POST)
        if form.is_valid():
            # Do something

1👍

Thats strange, I had the same problem and the same solution. After trying a bunch of alternatives I went back to user = request.user and it worked

0👍

if you want to set an addition request attr, based on user -> you need to use lazy Django function which is correctly handled by Field.get_prep_value

   from django.utils.functional import lazy
   request.impersonator = lazy(lambda: request.user.id, int)()

Leave a comment