2011-05-04 50 views
13

我怎么会呼吁以下多重提交表单 -引用多个提交按钮在Django

<form action="/" method="post"> 
    {% csrf_token %} 

    <input type="text" name="{{ email.id }}" value=" {{email}}"></td> 
    <td><input type="submit" value="Edit"></td> 
    <td><input type="submit" value="Delete"></td> 
</tr> 
</form> 

我想要做这样的事情 -

if value = edit: 
    do this 

if value = delete: 
    do this 

我怎么会在这个代码views.py文件?

回答

29

给输入类型一个名字,并在您的request.POST字典中查找它们。

例如为:

<form action="/" method="post"> 
    {% csrf_token %} 

    <input type="text" name="{{ email.id }}" value=" {{email}}"></td> 
    <td><input type="submit" value="Edit" name="_edit"></td> 
    <td><input type="submit" value="Delete" name="_delete"></td> 
</tr> 

和views.py像

if request.POST: 
    if '_edit' in request.POST: 
     do_edit() 
    elif '_delete' in request.POST: 
     do_delete() 

编辑:改变d.has_key(k)k in d每丹尼尔的评论。 has_key在python 3.0中被弃用,而in style被优先考虑,因为它更通用 - 特别是d.has_key(k)在d不是字典时失败,但k in d适用于任何可迭代的d(例如字典,字符串,元组,列表,集合)。

+2

自Python 2.4以来,'foo.has_key('bar')'已被拼写为foo中的'bar'。 – 2011-05-04 07:58:42

+0

@Daniel:谢谢 - 解释为什么'k in d'是首选的,因为它适用于任何可迭代的d。 – 2011-05-04 14:03:39

+2

请记住,如果表单中有多个提交按钮,并且用户按下Enter,则会自动单击HTML中第一个出现的按钮。 – 2011-05-05 15:52:01

4

你就需要给提交按钮的名称属性,例如说“动”,那么你就可以在request.POST集合中引用它们:

def my_view(request): 
    action = request.POST.get('action') 
    if action == 'Edit': 
     #do edit 
    else: 
     # do delete 

希望有所帮助你。

+0

标题的变化,例如后会打破国际化。虽然可以使用'

0
<form action="/" method="post"> 
<tr> 
    <td><input type="text" name="{{ email.id }}" value=" {{email}}"></td> 
    <td><input type="submit" value="Edit" name="submit"> </td> 
    <td><input type="submit" value="Delete" name="submit"> </td> 
</tr> 
</form> 

views.py会 -

def our_view(request): 
    if request.POST.get('submit') == 'Edit': 
     make_edit() 
    elif request.POST.get('submit') == 'Delete': 
     make_deletes() 
    else: 
     raise Http404() 
+0

我不认为这有效。看看你的'request.POST'字典。它将由'{'3':'[email protected]','编辑':'编辑'}'组成。就像你不能通过从request.POST获取'text'来引用电子邮件地址一样,你需要提供输入按钮的名字来获取它们的值。 – 2011-05-04 14:36:22

6

我知道这个问题被问得很久以前,但对于这里的战绩是使用基于类的视图的解决方案。它使用与jimbob博士的回答相同的html。

from django.views.generic.edit import FormView 

class MyView(FormView): 
    template_name = 'mytemplate.html' 
    form_class = MyForm 

    def form_valid(self, form): 
     if '_delete' in self.request.POST: 
      # do delete 
     elif '_edit' in self.request.POST: 
      # do edit 

form_valid默认行为是:

return HttpResponseRedirect(self.get_success_url()) 
+0

我用''如果“键”在form.data中:form.instance.field = special_value'' – 2017-06-08 14:54:37