2012-11-16 36 views
0

試圖在Django中創建一個Display,它看起來像這樣。Django:通過表單元更新數據庫行

鏈接:http://i47.tinypic.com/2lk2mw2.png

  1. 每天水果的數量是動態的,不同的日常生活。
  2. 註釋字段由管理員編輯。輸入將 然後被用於在數據庫中更新該行

問題:到目前爲止,我不確定如何去讓用戶在數據庫編輯註釋欄和現在的變化

**

  • fruits.html

**

{% for item in nodes %} 
<tr> 
    <td class = "tablebord"><a href ="/nodes/node/{{ item.nodeid }}/">{{ 
    item.nodeid }}</a></td> 
    <td class = "tablebord">{{ item.lastseen }} </td> 
    <td class = "tablebord"><div contenteditable>{{ item.comment }} <p> 
      <form action="" method="get"> 
       <input type="text" name="q"> 
       <input type="submit" value="test"> 
      </form> 
    </p> </div> </td> 
    <td class = "tablebord">{{ item.lastipaddr }} </td> 
</tr> 
{% endfor %} 
+0

那麼問題是什麼?你遇到錯誤?請問具體的問題。 – miki725

+0

我無法編輯註釋列並相應地更新數據庫 – vampure

回答

2

一個解決方案發生對我說:

在HTML:在表單POST

更改方法。

添加CSRF令牌形成。

添加隱藏的輸入和nodeid以便在視圖中解析。

帶當前註釋的預填充輸入。

<!-- Comment Cell --> 
<td class = "tablebord"> 
    <div contenteditable> 
    <form action="" method="post"> {% csrf_token %} 
     <input type="text" name="comment" value={{ item.comment }} /> 
     <input type="hidden" value={{ item.nodeid }} name="nodeid" /> 
     <input type="submit" value="edit" /> 
    </form> 
    </div> 
</td> 

在views.py:與CSRF

的CSRF令牌導入裝飾和節點模型

裝飾視圖保護。

檢查表單是否已提交。

如果是這樣,請獲取節點並更改註釋。

渲染模板。

# decorator 
from django.views.decorators.csrf import csrf_protect 

from app.Node.models import Node 

# view to handle table 
@csrf_protect 
def fruits(request): 
    nodes = Nodes.objects.all() 
    # user is posting: get edited node, change comment, and save 
    if request.POST: 
    nodeid = request.POST.get('nodeid') 
    edited_node = nodes.get(nodeid=nodeid) 
    edited_node.comment = request.POST.get('comment') 
    edited_node.save() 

    # render template with nodes 
    return render(request, 'fruits.html', {'nodes':nodes}) 

希望能回答你的問題。

+0

可以很好地解決問題,但是我遇到了一個csrf錯誤,然後按照您的步驟操作,但它並沒有消失。現在閱讀關於中間件的文檔 – vampure

+0

確保''django.middleware.csrf.CsrfViewMiddleware''在'settings.py'的'MIDDLEWARE_CLASSES'中,'{%csrf_token%}'在'

'內,確保'from django.views.decorators.csrf import csrf_protect'在views.py中,'@ csrf_protect'在視圖函數之上。這就是我能想到的。 –

+0

最好的答案。迄今爲止解決方案几乎完美。通過使用@csrf_exempt標記, – vampure