在django中引用多个提交按钮

时间:2011-05-04 03:22:23

标签: 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文件中对此进行编码?

5 个答案:

答案 0 :(得分:34)

为输入类型指定名称,并在request.POST字典中查找它们。

E.g:

<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 dhas_key在python 3.0中已弃用,并且首选in样式,因为它更通用 - 如果d不是字典,则d.has_key(k)会失败,但k in d适用于任何d这是一个可迭代的(例如,dict,string,tuple,list,set)。

答案 1 :(得分:8)

我知道很久以前就问过这个问题,但是这里的记录是使用基于类的视图的解决方案。它使用与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())

答案 2 :(得分:4)

您需要为提交按钮指定一个名称属性,例如“动作”,然后您可以在request.POST集合中引用它们:

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

希望能帮到你。

答案 3 :(得分: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()

答案 4 :(得分:0)

这是使用基于类的视图的解决方案:在您的CreateView和UpdateView中都使用此mixin

class CreateOrUpdateViewMixin:

    def form_valid(self, form):

        instance = form.save(commit=False)
        if "_save_as_new" in self.request.POST:
            instance.pk = None
        # Next row is optional
        instance.slug = instance._generate_unique_slug 
        self.object = instance
        return super().form_valid(form)

并按如下所示填写表格:

<form
    action="{{ instance.get_update_url }}"
    method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button
        type="submit">
        {% trans "Update the instance" %}
    </button>
    <button
        type="submit"
        name="_save_as_new">
        {% trans "Save as new" %}
    </button>
</form>

@Rushing_tadpole表示建议使用基于类的视图。