2

ビューに「is_draft owner」を呼び出す「document_delete」があります。

これは「is_draft_owner」です。

def is_draft_owner(id = None, user = None):
    if id and user:
        return user.pk is Draft.objects.get(id = id).user_id
    else:
        return False

def document_delete(request):
    if is_draft_owner(request.POST['id'], request.user):
        draft = Draft.objects.get(id = request.POST['id'])
        draft.delete()
        return HttpResponse("done")

これはページのビューです:

@login_required
def posting_draft(request):
    user = request.user
    user_drafts = Draft.objects.filter(user = user) # Order by date last oppened
    drafts = dict()
    for d in user_drafts:
        drafts[d.title] = d.id
    alertnum = get_alertnum(user)
    return render_to_response('Posting/Pages/posting_draft.html', {'STATIC_URL':STATIC_URL, 'draft_l' : drafts, 'selected':"dr", 'alertnum': alertnum})

どういうわけか、「is_draft_owner」を呼び出さないと、すべてが機能します。呼び出すと、次のようになります。

    [12/Aug/2012 00:53:45] "GET /posting/drafts HTTP/1.1" 200 2783
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 86, in run
    self.finish_response()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 127, in finish_response
    self.write(data)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 210, in write
    self.send_headers()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 268, in send_headers
    self.send_preamble()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 192, in send_preamble
    'Date: %s\r\n' % format_date_time(time.time())
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 324, in write
    self.flush()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 49948)
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 582, in process_request_thread
    self.finish_request(request, client_address)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/Library/Python/2.7/site-packages/Django-1.4-py2.7.egg/django/core/servers/basehttp.py", line 139, in __init__
    super(WSGIRequestHandler, self).__init__(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 640, in __init__
    self.finish()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 693, in finish
    self.wfile.flush()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------

念のため、このコードを使用する JavaScript ファイル:

function delete_draft(id, name) {
    var text = 'Are you sure you want to delete "' + name + '"?';
    var confirm = noty({
        text: text,
        layout: 'center',
        type: 'confirm',
        modal: true,
        buttons: [

        {addClass: 'btn btn-danger', text: 'Cancel', onClick: function($noty) {
            $noty.close();
        }
        },
            {addClass: 'btn btn-primary', text: 'Delete', onClick: function($noty) {
                $.post('/ajax/drafts/delete', {id:id}, function(data) {
                    document.location.reload(true);
                });
                document.location.reload(true);
            }
            }
    ]});
}

ページがドキュメントの削除を正常に呼び出していると思いますが、わかりませんが、リロードすると壊れます。これは、Google Chrome を使用している場合のログからは理にかなっているように見えますが (再度リロードすると削除されているため)、Firefox には当てはまらないようです。開発用サーバーを動かしているのですが、こういう問題が続き、後回しにできません(開発用サーバーの問題だという人もいますが、こうなると開発すらできません)。

4

1 に答える 1

1

あなたのコードにコメントを投稿します。しかし、送信された正確なエラーで質問を修正する必要があると思います。コメントで述べたように。

私はあなたのコードを編集します - うまくいけば、コメントは十分です:

# Here you mean to check for equality, `is` checks for identity
# Also, you want the return of the comparison; so you don't need
# an else.

def is_draft_owner(id = None, user = None):
    if id and user:
        return user.pk == Draft.objects.get(id = id).user_id

# You are POST-ing to this view, but
# you need to exempt it from csrf checks
# or edit your javascript to make sure it
# sends the csrf cookie.
def document_delete(request):
    if request.method == 'POST':
        if is_draft_owner(request.POST['id'], request.user):
            # Get raises an exception that you are not catching:
            try:
                 draft = Draft.objects.get(id = request.POST['id'])
            except Draft.DoesNotExist:
                 # Do something

            # OR you can do this
            draft = get_object_or_404(Draft,id=request.POST['id'])
            draft.delete()
            return HttpResponse("done")
    else:
         return HttpResponse('Not Allowed')
于 2012-08-12T14:16:41.703 に答える