如何在Django表单中创建多个提交按钮?

201 投票
6 回答
170693 浏览
提问于 2025-04-15 11:36

我有一个表单,里面有一个输入框用来填写邮箱,还有两个提交按钮,一个是订阅新闻通讯,另一个是退订:

<form action="" method="post">
{{ form_newsletter }}
<input type="submit" name="newsletter_sub" value="Subscribe" />
<input type="submit" name="newsletter_unsub" value="Unsubscribe" />
</form>

我还定义了一个表单的类:

class NewsletterForm(forms.ModelForm):
    class Meta:
        model = Newsletter
        fields = ('email',)

我需要自己写一个叫做 clean_email 的方法,而且我需要知道是哪个按钮提交了表单。但是,提交按钮的值并不在 self.cleaned_data 这个字典里。请问我还有其他办法获取按钮的值吗?

6 个回答

39

你也可以这样做,

 <form method='POST'>
    {{form1.as_p}}
    <button type="submit" name="btnform1">Save Changes</button>
    </form>
    <form method='POST'>
    {{form2.as_p}}
    <button type="submit" name="btnform2">Save Changes</button>
    </form>

代码

if request.method=='POST' and 'btnform1' in request.POST:
    do something...
if request.method=='POST' and 'btnform2' in request.POST:
    do something...
290

例如:

if 'newsletter_sub' in request.POST:
    # do subscribe
elif 'newsletter_unsub' in request.POST:
    # do unsubscribe
116

你可以在 clean_email 这个方法里使用 self.data 来获取用户提交的数据,这些数据是在验证之前的。这里面会有一个叫 newsletter_sub 或者 newsletter_unsub 的键,具体取哪个取决于用户按了哪个按钮。

# in the context of a django.forms form

def clean(self):
    if 'newsletter_sub' in self.data:
        # do subscribe
    elif 'newsletter_unsub' in self.data:
        # do unsubscribe

撰写回答