web-dev-qa-db-fra.com

Comment créer plusieurs boutons de soumission sous forme Django?

J'ai un formulaire avec une entrée pour le courrier électronique et deux boutons d'envoi pour vous abonner et vous désabonner de la newsletter:

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

J'ai aussi la forme de classe:

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

Je dois écrire ma propre méthode clean_email et j'ai besoin de savoir par quel bouton le formulaire a été soumis. Mais la valeur des boutons d'envoi ne figure pas dans le dictionnaire self.cleaned_data ..____ Est-ce que je pourrais obtenir les valeurs des boutons autrement?

128
veena

Vous pouvez utiliser self.data dans la méthode clean_email pour accéder aux données POST avant la validation. Il devrait contenir une clé appelée newsletter_sub ou newsletter_unsub en fonction du bouton sur lequel vous avez appuyé.

# 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
77
Ayman Hourieh

Par exemple:

if 'newsletter_sub' in request.POST:
    # do subscribe
Elif 'newsletter_unsub' in request.POST:
    # do unsubscribe
201
Oraculum

Vous pouvez aussi faire comme ça,

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

C'est une vieille question maintenant, néanmoins j'avais le même problème et j'ai trouvé une solution qui fonctionne pour moi: j'ai écrit 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
3
Sven

une URL à la même vue! ainsi!

###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>
0
chrisroker0