27

エラーメッセージに続いて、

/save/ int() 引数の TypeError は、'SimpleLazyObject' ではなく、文字列または数値でなければなりません

次のフォームの実行中。


ビュー.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
                    )

しかし、私はそれを修正する方法を理解できません。どうすれば修正できますか?

4

6 に答える 6

57

考えられる原因はuser = request.user、request.user が実際の User オブジェクトではなく、SimpleLazyObject インスタンスである を設定していることです。ジャンゴを参照してください: django.utils.functional.SimpleLazyObject の目的? 詳細については、使用request.user.idすると問題が解決するはずです。

于 2013-04-08T12:58:36.900 に答える
5

ほとんどの場合、ページを読み込んでいるユーザーは認証されていません。そのため、エラーがスローされます。データベースへの request.user 参照を保存する場合は、明らかに、認証されたユーザーのみが関数を呼び出せるようにする必要があります。

あなたの場合、2つの可能性があります.「@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

または - ユーザーが認証されているかどうかをコード内で確認します。

def bookmark_save_page(request):
    if request.method == 'POST' and request.user.is_authenticated():
        form = BookmarkSaveForm(request.POST)
        if form.is_valid():
            # Do something
于 2014-09-15T22:25:34.143 に答える