簡體   English   中英

如何構建多個提交按鈕 django 表單?

[英]How can I build multiple submit buttons django form?

我有一個表單,其中包含一個電子郵件輸入和兩個用於訂閱和取消訂閱時事通訊的提交按鈕:

<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字典中。 否則我可以獲得按鈕的值嗎?

例如:

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

您可以在clean_email方法中使用self.data在驗證之前訪問 POST 數據。 它應該包含一個名為newsletter_subnewsletter_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

你也可以這樣做,

 <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...

一個網址指向同一個視圖! 像這樣!

網址.py

url(r'^$', views.landing.as_view(), name = 'landing'),

視圖.py

class landing(View):
        template_name = '/home.html'
        form_class1 = forms.pynamehere1
        form_class2 = forms.pynamehere2
            def get(self, request):
                form1 = self.form_class1(None)
                form2 = self.form_class2(None)
                return render(request, self.template_name, { 'register':form1, 'login':form2,})

             def post(self, request):
                 if request.method=='POST' and 'htmlsubmitbutton1' in request.POST:
                        ## do what ever you want to do for first function ####
                 if request.method=='POST' and 'htmlsubmitbutton2' in request.POST:
                         ## do what ever you want to do for second function ####
                        ## return def post###  
                 return render(request, self.template_name, {'form':form,})
/home.html
    <!-- #### form 1 #### -->
    <form action="" method="POST" >
      {% csrf_token %}
      {{ register.as_p }}
    <button type="submit" name="htmlsubmitbutton1">Login</button>
    </form>
    <!--#### form 2 #### -->
    <form action="" method="POST" >
      {% csrf_token %}
      {{ login.as_p }}
    <button type="submit" name="htmlsubmitbutton2">Login</button>
    </form>

現在這是一個老問題,不過我遇到了同樣的問題並找到了一個適合我的解決方案:我寫了 MultiRedirectMixin。

from django.http import HttpResponseRedirect

class MultiRedirectMixin(object):
    """
    A mixin that supports submit-specific success redirection.
     Either specify one success_url, or provide dict with names of 
     submit actions given in template as keys
     Example: 
       In template:
         <input type="submit" name="create_new" value="Create"/>
         <input type="submit" name="delete" value="Delete"/>
       View:
         MyMultiSubmitView(MultiRedirectMixin, forms.FormView):
             success_urls = {"create_new": reverse_lazy('create'),
                               "delete": reverse_lazy('delete')}
    """
    success_urls = {}  

    def form_valid(self, form):
        """ Form is valid: Pick the url and redirect.
        """

        for name in self.success_urls:
            if name in form.data:
                self.success_url = self.success_urls[name]
                break

        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        """
        Returns the supplied success URL.
        """
        if self.success_url:
            # Forcing possible reverse_lazy evaluation
            url = force_text(self.success_url)
        else:
            raise ImproperlyConfigured(
                _("No URL to redirect to. Provide a success_url."))
        return url

我知道這是舊的,但一些答案至少可以說是簡短的,並且它們沒有解決表單不是 django 表單的常見情況。

這個解決方案的靈感來自這篇博文 它依賴於使用派生自 django.views.generic.edit.FormMixin 的視圖類,例如 CreateView、UpdateView 或 DeleteView。 這些提供了get_success_url方法,該方法在請求中公開按鈕名稱

html

<html>
    <body>
        <form method="post">
            <div>
                <label> <input type="radio" name="select-type" value="A">Type A</label>
            </div>
            <div>
                <label> <input type="radio" name="select-type" value="B">Type B</label>
            </div>
            <div>
                <input type="submit" value="Use selected">
            </div>
            <div>
                <input type="submit" name="no-selection" value="None of the above">
            </div>
        </form>
    </body>
</html>

視圖.py

from django.views.generic import UpdateView

class GetType(UpdateView):
    def get(self, request):
        return render(request, 'get_type.html', {})

    def post(self, request):
        button = self.get_success_url()
        print(button)

    def get_success_url(self):
        if 'no-selection' in self.request.POST:
            return 'none selected'
        return ''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM