在django中引用多个提交按钮

在django中引用多个提交按钮,django,Django,我如何调用以下多个提交表单-- 如何在views.py文件中对其进行编码?您需要为提交按钮提供名称属性,例如说“操作”,然后您可以在request.POST集合中引用它们: def my_view(request): action = request.POST.get('action') if action == 'Edit': #do edit else: # do delete 希望这对您有所帮助。为输入类型命名,并在您的请求中查找它

我如何调用以下多个提交表单--


如何在views.py文件中对其进行编码?

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

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

希望这对您有所帮助。

为输入类型命名,并在您的
请求中查找它们。发布
字典

例如:


编辑:根据Daniel的评论,将d.has_key(k)
更改为d中的k<在python 3.0中,code>has_key
不受欢迎,而in样式更受欢迎,因为它更通用——特别是
d.has_key(k)
如果d不是字典,则会失败,但
k in d
适用于任何iterable(例如,dict、string、tuple、list、set)的
,但是这里有一个使用基于类的视图的解决方案。它使用与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\u valid
的默认行为是:

return HttpResponseRedirect(self.get_success_url())

下面是一个使用基于类的视图的解决方案:在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>

{%csrf_令牌%}
{{form.as_p}}
{%trans“更新实例”%}
{%trans“另存为新”%}

感谢@Rushing\u tadpole建议使用基于类的视图。

foo.has\u key('bar'))
自Python 2.4以来,在foo中被拼写为
'bar'。丹尼尔:谢谢——编辑后解释了为什么d中的
k
是首选,因为它适用于任何适合的d。请记住,如果表单中有多个提交按钮,并且用户按Enter键,然后,它将自动单击HTML中最先出现的按钮。@stevejalim-是,如果有
字段,并且用户按enter键,则默认情况下将发送第一个输入类型=提交。但是您可以使用一些javascript来禁用此行为。例如,这对我处理脆表单不起作用。我认为这不起作用。查看您的
请求。发布
词典。它将由类似于
{'3':'example@example.com“,”编辑“:”编辑“}
。正如您无法通过从
请求.POST
获取
'text'
来引用电子邮件地址一样,您需要提供输入按钮的名称以获取其值。在标题更改(例如国际化)后将中断。但是将使用
s。我在form.data:form.instance.field=special_值中使用了
if“key”
<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>
def our_view(request):
    if request.POST.get('submit') == 'Edit':
        make_edit()
    elif request.POST.get('submit') == 'Delete':
        make_deletes()
    else:
        raise Http404()
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
return HttpResponseRedirect(self.get_success_url())
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>