在django中删除带有表单的对象

时间:2018-05-26 21:08:59

标签: django

我正在显示一张桌子。在每一行中都应该有一个删除按钮,用于从表中删除元素。

我的问题是,我不确定如何将元素的id传递给视图。

HTML:

{% for post in posts %}
    <div>
        <h3>Zuletzt ausgewählt:</h3>
        <p>published: <b>{{ post.pub_date }}</b>
        </p>
        <p>
            name: <b>{{ post.Name }}</b>
            anmeldung: <b>{{ post.get_Anmeldung_display }}</b>
            essen: <b>{{ post.get_Essen_display }}</b>
                <form action="" method="POST">
                  {% csrf_token %}
                  <input class="btn btn-default btn-danger" name="delete" type="submit" value="Löschen"/>
                </form>
        </p>
        <p>
            Email: <b>{{ post.Email }}</b>
        </p>
    </div>
{% endfor %}

views.py

if request.method == 'POST' and 'delete' in request.POST:
    Eintrag.objects.filter(pk=id).delete()
    return HttpResponseRedirect(request.path)  

所以我需要将每个帖子的post.pub_date传递给视图,我该如何实现呢?

3 个答案:

答案 0 :(得分:1)

  

我的问题是,我不知道如何将元素的id传递给视图。

我可以想到两种方法来做到这一点。我将逐一介绍它们。

1。在您的应用中专门为删除对象创建单独的网址路径:

('/post/<pk>/delete/', name="delete_post"),

然后将表单的action指向此网址:

<form action="{% url 'delete_post' post.pk %}" method="POST">
    ...

最后,修改您的视图函数以接受pk参数:

def my_view(request, pk): 
    ...

2。第二种方法是在表单中创建另一个字段并将其传递给对象的pk:

只需在表单中创建另一个字段。

<form action="" method="POST">
    <input type="hidden" value="{{ post.pk }}" name="pk">
    ...

然后在您的视图中,只需查看request.POST['pk']即可获得该帖子的内容。

答案 1 :(得分:1)

使用Django通用视图时非常容易实现的非ajax方法是这样的:

template.html

{% for post in posts %}
<div>
    <h3>Zuletzt ausgewählt:</h3>
    <p>published: <b>{{ post.pub_date }}</b>
    </p>
    <p>
        name: <b>{{ post.Name }}</b>
        anmeldung: <b>{{ post.get_Anmeldung_display }}</b>
        essen: <b>{{ post.get_Essen_display }}</b>
            <form action="" method="POST">
              {% csrf_token %}
              <input class="btn btn-default btn-danger" name="delete" type="submit" value="Löschen"/>
            </form>
    </p>
    <p>
        Email: <b>{{ post.Email }}</b>
    </p>
    <a href="/deleteurl/{{ post.pk }}">
        Delete this!
    </a>
</div>
{% endfor %}

一旦用户点击了删除链接,他们就会被重定向到删除视图和模板,该网址的网址会显示为“/ deleteurl / 1 /".

然后,您处理删除的视图,网址和模板集如下所示:

views.py

class DeleteMe(generic.DeleteView):
    template_name = 'deleteconfirmation.html'
    model = YourModel
    success_url = '/YourRedirectUrl/'

urls.py

url(r'^deleteurl/(?P<pk>\d+)/$', 
    views.DeleteMe.as_view(), name='deletemeview'),     

deleteconfirmation.html

<form action="" method="post">{% csrf_token %}
    <p>Are you sure you want to delete "{{ object }}"?</p>
    <input type="submit" value="Confirm" />
</form>

同样,这不使用Ajax。

视图和模板直接来自Django Docs

答案 2 :(得分:0)

使用POST是我们的首要任务,但我认为添加其他形式将是多余的。

django-allauth'电子邮件视图中找到了解决方案。
尽管它不包括确认步骤(例如在文档中,@ HoneyNutIchiros或in more details或通过onclick提到),它还是有用的。
他们在按钮上添加名称(action_remove)并在request.POST格中对其进行检查:

# account/email.html
<button type="submit" name="action_primary" >{% trans 'Make Primary' %}</button>
<button type="submit" name="action_send" >{% trans 'Re-send Verification' %}</button>
<button type="submit" name="action_remove" >{% trans 'Remove' %}</button>
...
<button name="action_add" type="submit">{% trans "Add E-mail" %}</button>

# account/views.py
class EmailView(AjaxCapableProcessFormViewMixin, FormView):
    ...
    def post(self, request, *args, **kwargs):
        ...
        if "action_add" in request.POST:
            res = super(EmailView, self).post(request, *args, **kwargs)
        elif "action_remove" in request.POST:
            res = self._action_remove(request)
        ...
        return res