2013-04-08 22 views
24

Ich habe Nachrichten folgende Fehler,int() Argument muss eine Zeichenkette oder eine Zahl sein, nicht 'SimpleLazyObject'

Typeerror auf// int save() Argument muss eine Zeichenkette oder eine Zahl sein, nicht 'SimpleLazyObject'

Während der Ausführung des folgenden Formulars.


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) 

Ich dachte, ich Fehler bekam, weil ich Link an

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

Aber ich kann nicht herausfinden, wie es zu beheben. Wie kann ich es beheben?

+1

Nun, den Fehler Sie bekommen sollte ein bisschen mehr haben Informationen, vielleicht, wenn Sie die ganze Spur posten könnten, die helfen würde. –

Antwort

50

Die wahrscheinlichste Ursache ist, dass Sie user = request.user festlegen, wobei request.user kein echtes User-Objekt, sondern eine SimpleLazyObject-Instanz ist. Weitere Informationen finden Sie unter django: Purpose of django.utils.functional.SimpleLazyObject?, aber die Verwendung von request.user.id sollte Ihr Problem beheben.

+2

Danke! Aber ich habe immer noch Fehler ... Kann nicht "1" zuweisen: "Bookmark.user" muss eine "User" -Instanz sein. – yup

+0

OK, dann versuchen Sie, das Benutzerobjekt zu laden - haben Sie den Link gelesen, den ich gestellt habe? Könnte etwas wie 'user = auth.get_user (request)' machen. Dann kann ich immer noch nur erraten, wo der Fehler ohne eine detailliertere Fehlerverfolgung auftritt. –

+0

Nachdem ich viele andere Methoden ausprobiert habe, habe ich herausgefunden, dass der erste Fehler (user = request.user) sich als Varid erwiesen hat ... so seltsam ..., ich bin neu im Django, also muss ich vielleicht verstehen Django durch Lesen der Dokumentation vollständig. Aber danke Martin, dass du mir geholfen hast, das Konzept von User-Objekt und SimpleLazyObject zu verstehen. – yup

1

Das ist seltsam, ich hatte das gleiche Problem und die gleiche Lösung. Nachdem ich eine Reihe von Alternativen ausprobiert hatte, ging ich zurück zu user = request.user und es funktionierte

11

Sie müssen sich anmelden, wenn Sie diesen Code auf localhost ausführen. Ansonsten wird die request.user eine SimpleLazyObject sein, dann kommt der Fehler heraus.

+3

Dies kann passieren, wenn Sie eine Ansicht haben, die versucht Suchen Sie nach 'request.user' in der Datenbank und vergessen Sie, den' login_required'-Dekorator hinzuzufügen, und Sie versuchen, auf die Ansicht zuzugreifen, ohne angemeldet zu sein. – qris

7

Hier versuchen Sie basieren auf request.user ein Lesezeichen-Objekt zu erstellen, aber request.user ist ein SimpleLazyObject, so können wir durch ein sichereres Benutzerobjekt erhalten:

from django.contrib import auth 

current_user = auth.get_user(request) 

und weiterhin Ihre Abfrage sollten sein

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

Wahrscheinlich ist der Benutzer, der die Seite lädt, nicht authentifiziert. Daher wird der Fehler ausgelöst. Wenn Sie einen request.user-Verweis auf die Datenbank speichern möchten, müssen Sie natürlich sicherstellen, dass nur authentifizierte Benutzer die Funktion aufrufen können.

In Ihrem Fall gibt es zwei Möglichkeiten - fügen Sie den "@login_required" Dekorator der Funktion hinzu oder überprüfen Sie, ob der Benutzer innerhalb des Codes authentifiziert ist. Hier sind die Schnipsel:

Mit 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 

ODER - in den Code zu überprüfen, ob der Benutzer authentifiziert ist:

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