yup
yup

Reputation: 329

int() argument must be a string or a number, not 'SimpleLazyObject'

I got, following Error messages,

TypeError at /save/ int() argument must be a string or a number, not 'SimpleLazyObject'

While executing following form.


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)

I thought I got error because I passed link at

bookmark, created = Bookmark.objects.get_or_create(
                    user=request.user,
                    link=link
                    )

But I can not figure out how to fix it. How can I fix it?

Upvotes: 28

Views: 36982

Answers (6)

pymen
pymen

Reputation: 6549

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)()

Upvotes: 0

Vidya Sagar
Vidya Sagar

Reputation: 1526

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
                    )

Upvotes: 9

dh1tw
dh1tw

Reputation: 1491

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

Upvotes: 5

fmx
fmx

Reputation: 111

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.

Upvotes: 11

theptrk
theptrk

Reputation: 840

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

Upvotes: 1

Martin B.
Martin B.

Reputation: 1928

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.

Upvotes: 57

Related Questions