2013-04-08 155 views
24

我得到,隨後的錯誤消息,INT()參數必須是字符串或數字,而不是「SimpleLazyObject」

在類型錯誤/保存/ 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」:「Bookmark.user」必須是「用戶」實例。 – yup

+0

好吧,然後嘗試加載用戶對象 - 你讀過我提出的鏈接嗎?可能會做一些像'user = auth.get_user(request)'。然後,我仍然只能猜測出現錯誤的位置,而沒有更詳細的錯誤跟蹤。 –

+0

當我嘗試了很多其他方法後,我找到了第一個出現錯誤(user = request.user)的地方,它被證明是varid ...太奇怪了......,我是django的新手,所以我可能需要了解Django完全通過閱讀文檔。但是,感謝Martin,幫助我理解關於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」裝飾器添加到函數中,或者檢查用戶是否在代碼中進行了驗證。下面是摘錄:

隨着裝飾:

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 - 裏面的代碼檢查,如果用戶進行身份驗證:

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