2009-05-14 8 views
119

私は1つの電子メールの入力および2購読やニュースレターの購読を解除するためのボタンを提出すると、フォームがあります:私は私自身のclean_email方法およびIを記述する必要があります複数の送信ボタンを作成するにはどうすればよいですか?

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

:私もクラスのフォームを持っている

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

をどのボタンが提出されたフォームであるかを知る必要があります。しかし、送信ボタンの値はself.cleaned_data辞書にはありません。 そうでなければボタンの値を取得できますか?

答えて

70

clean_emailメソッドのself.dataを使用して、検証前にPOSTデータにアクセスできます。どのボタンが押されたかによって、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 
+4

注釈付きの例はありますか?それは本当に助けになるでしょう – Jharwood

+7

私は 'クリーン'は実際にモデルレベルのロジックを行う場所の右のようなものではないとは思わない。具体的には、フォームを整理し、複数の入力にまたがるValidationErrorを見つけることです。スヴェーンの答えは正しい方向にあるが、必ずしも最良の答えではない – Patrick

+4

セキュリティリスク!フォームが検証される前にフォームデータを使用してデータベースを変更すると危険です。 –

189

例:

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

clean_xxx検証方法の中でリクエストが利用できますか? – sureshvv

8

あなたはまた、次のように行うことができ、

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

CODE

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

form1.as_pこれはいつ使うのですか?ビューの中で、フォームの有効性をチェックしながら、私ができることを望む... form1.is_valid()そして、これを行う、form2.is_valid()これを行う.. – tilaprimera

3

それは以前の質問ですが、私は同じ問題があり、私のために働く解決策を見つけました。私は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 
+0

どのように正確にMultiRedirectMixinを使いますか?例を挙げて説明してください。 –

0

同じビューに1つのURL! ように!

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

####views.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> 
関連する問題