2013-04-08 51 views
24

tôi, sau Thông báo lỗi,int() lập luận phải là một chuỗi hoặc một số, chứ không phải 'SimpleLazyObject'

TypeError tại/lưu/int() lập luận phải là một chuỗi hoặc một số, chứ không phải 'SimpleLazyObject'

Trong khi thực hiện biểu mẫu sau.


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) 

tôi nghĩ rằng tôi đã nhận lỗi vì tôi đã thông qua liên kết ở

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

Nhưng tôi không thể tìm ra cách để sửa chữa nó. Làm cách nào để khắc phục sự cố?

+1

Vâng, lỗi mà bạn đang nhận được nên có nhiều hơn một chút thông tin, có thể nếu bạn có thể đăng toàn bộ dấu vết có thể hữu ích. –

Trả lời

50

Nguyên nhân có thể là bạn đang đặt user = request.user, trong đó request.user không phải là đối tượng Người dùng thực, mà là một cá thể SimpleLazyObject. Xem django: Purpose of django.utils.functional.SimpleLazyObject? để biết thêm chi tiết, nhưng sử dụng request.user.id sẽ khắc phục sự cố của bạn.

+2

Cảm ơn! Nhưng tôi vẫn gặp lỗi ... Không thể gán "1": "Bookmark.user" phải là phiên bản "Người dùng". – yup

+0

OK, sau đó thử tải đối tượng người dùng - bạn đã đọc liên kết tôi đã tạo chưa? Có thể làm một cái gì đó như 'user = auth.get_user (request)'. Sau đó, một lần nữa tôi vẫn có thể đoán được nơi lỗi của bạn xảy ra mà không có một dấu vết lỗi chi tiết hơn. –

+0

Sau khi tôi thử nhiều phương pháp khác, tôi đã tìm ra phương pháp đầu tiên mà tôi gặp lỗi (user = request.user) được chứng minh là ... ... lạ, ... tôi mới dùng django, vì vậy tôi có thể cần hiểu django thông qua tài liệu đọc hoàn toàn. Nhưng cảm ơn Martin, đã giúp tôi nắm bắt được khái niệm về đối tượng User và SimpleLazyObject. – yup

1

Thats lạ, tôi đã có cùng một vấn đề và giải pháp tương tự. Sau khi thử một loạt các lựa chọn thay thế, tôi đã quay lại user = request.user và nó đã hoạt động

11

Bạn phải đăng nhập khi chạy đoạn mã này trên máy chủ cục bộ. Nếu không, request.user sẽ là SimpleLazyObject, sau đó các lỗi sẽ xuất hiện.

+3

Điều này có thể xảy ra nếu bạn có lượt xem thử tra cứu 'request.user' trong cơ sở dữ liệu và bạn quên thêm trang trí' login_required', và bạn cố gắng truy cập chế độ xem mà không cần đăng nhập. – qris

7

Ở đây bạn cố gắng để tạo ra một đối tượng Bookmark dựa trên request.user, nhưng request.user là một SimpleLazyObject, vì vậy chúng tôi có thể nhận được một đối tượng người dùng an toàn hơn bằng cách:

from django.contrib import auth 

current_user = auth.get_user(request) 

và tiếp tục truy vấn của bạn nên có

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

Rất có thể người dùng đang tải trang không được xác thực. Có lỗi được ném. Nếu bạn muốn lưu tham chiếu request.user vào cơ sở dữ liệu, bạn rõ ràng phải đảm bảo rằng chỉ những người dùng được xác thực mới có thể gọi hàm đó.

Trong trường hợp của bạn có hai khả năng - thêm "@login_required" trang trí với chức năng hoặc kiểm tra nếu người dùng được xác thực bên trong mã. Dưới đây là các đoạn:

Với 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 

HOẶC - kiểm tra bên trong mã nếu người dùng được xác thực:

def bookmark_save_page(request): 
    if request.method == 'POST' and request.user.is_authenticated(): 
     form = BookmarkSaveForm(request.POST) 
     if form.is_valid(): 
      # Do something 
Các vấn đề liên quan