我正在显示一张桌子。在每一行中都应该有一个删除按钮,用于从表中删除元素。
我的问题是,我不确定如何将元素的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传递给视图,我该如何实现呢?
答案 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