【问题标题】:Django: updating database row via table cellDjango:通过表格单元格更新数据库行
【发布时间】:2012-11-16 05:47:08
【问题描述】:

尝试在 Django 中创建一个 Display,看起来像这样。

链接: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 %}

【问题讨论】:

  • 那么问题是什么?你得到错误?请具体询问。
  • 我无法编辑评论栏并相应地更新数据库

标签: django


【解决方案1】:

我想到的一个解决方案:

在 HTML 中:

将表单中的方法更改为 POST。

将 CSRF Token 添加到表单中。

添加带有 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 Token 和 Node 模型的导入装饰器

使用 CSRF Protect 装饰视图。

检查表单是否提交。

如果是,获取节点并更改评论。

渲染模板。

# 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})

希望这能解决您的问题。

【讨论】:

  • 很好的解决方案,但是,我遇到了一个 csrf 错误,按照您的步骤操作,但它并没有消失。现在阅读关于中间件的文档
  • 确保'django.middleware.csrf.CsrfViewMiddleware'MIDDLEWARE_CLASSESsettings.py中,{% csrf_token %}&lt;table&gt;&lt;/table&gt;中,确保from django.views.decorators.csrf import csrf_protect在views.py中,@csrf_protect在上面查看功能。我能想到的就这些了。
  • 利用@csrf_exempt 标签克服了csrf问题
猜你喜欢
  • 2022-12-17
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2019-10-10
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多