2013-04-08 4 views
24

я получил после сообщений об ошибках,Int() аргумент должен быть строкой или числом, а не «SimpleLazyObject»

TypeError в/сохранить/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

Ну, ошибку вы получаете должны иметь немного больше информация, может быть, если бы вы могли опубликовать весь след, который бы помог. –

ответ

50

Вероятная причина в том, что вы устанавливаете user = request.user, где request.user не является реальным объектом User, а экземпляром SimpleLazyObject. См. django: Purpose of django.utils.functional.SimpleLazyObject? для получения более подробной информации, но с использованием request.user.id следует исправить вашу проблему.

+2

Спасибо! Но у меня все еще есть ошибка ... Невозможно назначить «1»: «Закладка.user» должна быть экземпляром «Пользователь». – yup

+0

Хорошо, тогда попробуйте загрузить объект пользователя - вы прочитали ссылку, которую я поставил? Может сделать что-то вроде 'user = auth.get_user (request)'. Затем я еще могу только догадываться, где происходит ваша ошибка без более подробной трассировки ошибок. –

+0

После того, как я пробовал много других методов, я понял, что первый из них получил ошибку (user = request.user), которая оказалась varid ... так странно ..., я новичок в django, поэтому мне может понадобиться понять django через полную документацию по чтению. Но благодарю вас, Мартин, за то, что помог мне понять концепцию объекта User и SimpleLazyObject. – yup

1

Это странно, у меня была та же проблема и такое же решение. Попробовав кучу альтернатив, я вернулся к user = request.user, и он сработал

11

Вы должны войти в систему при запуске этой части кода на localhost. В противном случае request.user будет SimpleLazyObject, тогда ошибки появятся.

+3

Это может произойти, если у вас есть представление, которое пытается для поиска 'request.user' в базе данных, и вы забудете добавить декоратор' login_required', и вы попытаетесь получить доступ к представлению без входа в систему. – qris

7

Здесь вы пытаетесь создать объект закладки на основе 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 
        ) 
5

Скорее всего, пользователь, загружающий страницу, не аутентифицирован. Для этого возникает ошибка. Если вы хотите сохранить ссылку request.user в базе данных, вы, очевидно, должны убедиться, что только аутентифицированные пользователи могут вызвать функцию.

В вашем случае есть две возможности - добавьте декоратор «@login_required» в функцию или проверьте, не аутентифицирован ли пользователь внутри кода. Вот отрывки:

С 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 

ИЛИ - проверка внутри кода, если пользователь прошел проверку подлинности:

def bookmark_save_page(request): 
    if request.method == 'POST' and request.user.is_authenticated(): 
     form = BookmarkSaveForm(request.POST) 
     if form.is_valid(): 
      # Do something 
Смежные вопросы