2009-05-14 15 views
119

E-posta için bir giriş formu ve e-bülten abone olmak için iki adet gönderim butonum var:Birden çok gönderme düğmesinin django formunu nasıl oluşturabilirim?

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

Ayrıca şu şekilde bir de formum var:

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

Kendi clean_email yöntemimi yazmalıyım ve ihtiyacım var hangi düğmenin sunulduğunu bilmek. Ancak, gönder düğmelerinin değeri self.cleaned_data sözlüğünde değildir. Aksi takdirde buton değerlerini alabilir miyim?

cevap

70

Sen doğrulama önce POST verilerine erişmek için clean_email yöntemde self.data kullanabilirsiniz. Bu basılmış hangi düğme bağlı newsletter_sub veya newsletter_unsub adında bir anahtarı bulunmalıdır.

# 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

Eğer açıklamalı örnek verebilir? Gerçekten – Jharwood

+7

ben clean' gerçekten modeli düzey mantığı yapmak yerine doğru tür değil 'sanmıyorum yardımcı olur. Özellikle bir formu temizlemek ve birden çok girdiyi kapsayan herhangi bir ValidationError ifadesini bulmak içindir. Sven'in cevabı doğru yönde daha fazla ama yine de en iyi cevap – Patrick

+4

Güvenlik Riski! Form doğrulandıktan önce veritabanında değişiklik yapmak için form verilerini kullanmak tehlikelidir. –

189

Örn:

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

Clean_xxx doğrulama yöntemlerinde istek var mı? – sureshvv

8

Ayrıca böyle yapabiliriz,

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

KOD

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 bu ne zaman kullanılır? formun geçerliliğini kontrol ederken görünümlerinde, ben yapmak isterdim ... form1.is_valid() daha sonra bunu,) (form2.is_valid bunu .. – tilaprimera

3

Artık eski soru, yine de ben aynı sorunu vardı ve benim için çalışan bir çözüm bulundu: Ben MultiRedirectMixin yazdım.

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

Nerede ve MultiRedirectMixin tam olarak nasıl kullanacak? Lütfen bir örnekle detaylandırın. –

0

Aynı görünüm için bir url! bunu beğendi!

###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> 
İlgili konular