【问题标题】:insert / delete post requests in same template django在同一模板django中插入/删除帖子请求
【发布时间】:2015-09-30 14:36:17
【问题描述】:

我有一个显示数据的表格,我有一个带有提交按钮的表单,可以在 mysql 数据库中插入数据,我在每一行旁边添加了按钮,上面写着“删除”,这样我就可以从网站上删除每一行也是。

当我点击按钮时我得到了 id,但我还不知道如何将它传递给视图,但我现在的主要问题是第二个帖子不起作用。

template.py

<tr>
     <td>{{b.ip}}</td>
     <td>{{b.polling_time}}</td>
     <td>{{b.communitydata}}</td>
     <td>{{b.snmp_oid}}</td>
     <td>{{b.lastcheck|date:"Y.m.d H:m:s"}}</td>
     <form action="/services/listpoll/" method="post">{% csrf_token %}
       <td><input type="button" id="{{b.id}}" class="delete_poll" value="Borrar"></td>
     </form>
 </tr>

jquery

$(".delete_poll").click(function(){

          id_poll = $(this).attr('id');

  });

views.py

def listpolls(request):
    connect_mysql = mdb.connect('***', '***', '***', '***')
    cursorMYSQL = connect_mysql.cursor(mdb.cursors.DictCursor)
    query = "select id,ip,polling_time,communitydata,snmp_oid,lastcheck from snmptt_listpolls order by ip desc limit 100"
    cursorMYSQL.execute(query)
    b = cursorMYSQL.fetchall()
    connect_mysql.close()

    if request.method == 'POST':

        form = AddPollForm(request.POST)

        if form.is_valid():

            ip = form.cleaned_data['poll_ip']
            poll_time = form.cleaned_data['poll_time']
            communitydata = form.cleaned_data['communitydata']
            snmp_oid = form.cleaned_data['snmp_oid']
            lastcheck = form.cleaned_data['lastcheck']

            cursorMYSQL = connect_mysql.cursor(mdb.cursors.DictCursor)
            cursorMYSQL.execute("""insert into snmptt_listpolls (ip, polling_time, communitydata, snmp_oid) values ('%s','%s','%s','%s')"""%(ip, poll_time, communitydata, snmp_oid))

            connect_mysql.commit()
            connect_mysql.close()

            return HttpResponseRedirect('listpolls.html')

        elif request.method == 'POST' and not form.is_valid(): 

            id_poll = '53';

            cursorMYSQL = connect_mysql.cursor(mdb.cursors.DictCursor)
            cursorMYSQL.execute(""" delete from snmptt_listpolls where id='%s' """%(id_poll))

            connect_mysql.commit()
            connect_mysql.close()

            return render_to_response("listpolls.html",{"buffer_data": b, 'form': form} ) 

    else:
        form = AddPollForm()
        return render_to_response("listpolls.html",{"buffer_data": b, 'form': form} ) 

所以,这次我只是想检查发布请求是否有效,所以当我点击它时,它会删除 ID 为 53 的行,但它不起作用,所以我想我做错了什么并且帖子没有通过。

谢谢!

【问题讨论】:

  • 完全不相关,但你到底为什么要使用MySQLdb而不是使用内置ORM直接连接到数据库???
  • @brunodesthuilliers 这是我两天内第二次看到有人直接使用 python mysql 库,完全绕过 orm。
  • 通过对用户输入使用字符串插值,不仅绕过了 orm,还绕过了 dbapi 卫生层...... Little Bobby Table 有人吗?让我们不要谈论硬编码的连接数据和无用的关闭/重新打开连接......我很惊讶操作至少使用了 django 表单

标签: jquery python mysql django


【解决方案1】:

我还不能评论。所以请把它当作评论。

我认为执行不会到达第二个帖子

elif request.method=="POST":

另外你为什么不使用 Django 模型而不是使用 MySQL 明确地这样做。

要删除一个项目,您可以使用带有项目 ID 的 jquery ajax 发布请求并在视图中处理它。

【讨论】:

  • 问题是再次发帖时我不知道如何区分它们。
  • 所以你问的是,当你发出另一个帖子请求时,你将如何区分?
  • 我有一个提交表单按钮,它将数据发布到 mysql(插入),然后删除按钮也从数据库中删除。
  • 我没用过,但它应该可以工作:你可以让另一个视图通过 ajax 来处理它。比如你可以新建一个视图delete_poll,你可以通过ajax处理删除并通过json返回响应。
【解决方案2】:

在一个视图中处理两个(或更多)不同的表单不是火箭科学:您只需要确定发布了哪个表单,这很容易通过每个表单中的隐藏输入来完成。

 <td>
   <!-- HTML doesn't allow <form> around the <td> -->
   <form action="/services/listpoll/" method="post">
     {% csrf_token %}
     <input type="hidden" name="action" value="delete">
     <input type="hidden" name="poll_id" value="{{b.id}}">
     <input type="button" class="delete_poll" value="Borrar">
   </form>
 </td>

现在您可以摆脱无用的 jquery 内容并处理视图中的删除:

def listpolls(请求): # 剪掉这里无关的 MySQLdb 代码, # 请使用 orm 或至少使用 db 后端连接

if request.method == 'POST':
    if request.post.get("action", "") == "delete":            
        # don't assume - check
        poll_id = request.post.get("poll_id", None)
        if poll_id is not None:
            delete_poll_here()
    else: 
        form = AddPollForm(request.POST)
        # etc

现在请您自己(以及需要维护您代码的人)做一项服务:学习正确使用 Django 的 ORM,学习正确使用 Python 的 dbapi...这个:

cursorMYSQL.execute(
   """insert into snmptt_listpolls 
       (ip, polling_time, communitydata, snmp_oid) 
      values ('%s','%s','%s','%s')
   """ % (ip, poll_time, communitydata, snmp_oid))

对 SQL 注入开放。正确的做法是

cursorMYSQL.execute(
   """insert into snmptt_listpolls 
       (ip, polling_time, communitydata, snmp_oid) 
      values (%s,%s,%s,%s)
   """, (ip, poll_time, communitydata, snmp_oid))

但是当你有模型和模型表单时,你在 Django 中真的不需要这个。

【讨论】:

  • 我不能使用第二个例子,我得到一个 ProgrammingError。
  • 我修好了 - 不需要在占位符周围加引号
  • 是的,谢谢,它适用于我的一个查询,但我得到另一个查询的 TypeError。估计是mysql表中数据类型的原因吧?
  • @BobbyChenyChen 抱歉,但在调试时我不会“猜测”任何东西 - 我阅读了回溯,检查了我的代码、变量等。现在如果你正确使用了 Django(在这种情况下使用正确的模型和模型表单)你不会浪费时间调试平凡的细节。
  • 另外,我仍然无法让不同的 POST 工作,我正在为此提出一个新问题,因为这有很多 cmets 并且太长了。
猜你喜欢
  • 2017-12-04
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多