【问题标题】:How to delete object in django view?如何在 django 视图中删除对象?
【发布时间】:2015-05-27 15:06:34
【问题描述】:

我有一个模型产品:

class Product(models.Model):
    name = models.CharField(verbose_name="name", max_length=40)
    cost = models.FloatField(verbose_name="price")

    def __unicode__(self):
        return self.name

我创建了一个可以添加新产品的视图,但如何删除这些产品?

我的想法:

def delete_product(request, pk):
    if request.method == "POST":
        if form.is_valid():
            product = form.delete(commit=False)
            product.delete()
            return redirect('homeshop.views.product_list', pk=product.pk)

但是接下来呢?我添加到模板(我可以在其中编辑产品并保存它)但它不起作用:

{{ delete_product }}

现在在我的模板中:

{% block content %}
    <h1>Nowy wydatek</h1>
    <form method="POST" class="product-form">{% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Save</button>
    </form>
{% endblock %}

【问题讨论】:

  • 您需要创建一个链接/按钮/其他一些元素,单击该元素时会调用该视图功能。通过转到特定 URL 或使用 AJAX。

标签: python django


【解决方案1】:

你需要做这样的事情:

模板.html

{% for product in products %}
{% csrf_token %}
...
<form action="{% url 'delete_product' product.id %}" method="POST">
  <button type="submit">Delete</button>
</form>
...
{% endfor %}

那么您需要更新您的 urls.py 以定义一个在访问正确 URL 时调用您的删除函数的 URL。

    url(
        r'^delete/<product_id>$',
        'delete_product',
        name='delete_product'
    )

我不知道你的 urls.py 是如何布局的,所以你的 URL 可能看起来有点不同。

【讨论】:

  • 这不是一个链接,而是一个带有 method="POST" 的表单。基于 GET 删除(或修改)数据是一种不好的做法(请参阅stackoverflow.com/questions/705782/…)。
  • @Weier 更新答案以使用带有 HTTP DELETE 方法的表单
  • 我想你忘了包括csrf_token
  • 谢谢你的建议,我在这个模板中添加了我现在拥有的东西,我还需要写什么?
  • 有趣的是,HTML5 不支持DELETE 的表单。快速搜索后,我在SE: Programmers 上找到了一个答案,说 HTML 表单不支持PUTDELETE 基本上是因为没有人为其编写规范。
猜你喜欢
  • 2013-11-14
  • 2018-10-23
  • 1970-01-01
  • 2019-08-03
  • 2011-03-08
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
相关资源
最近更新 更多