복붙노트

[PYTHON] 어떻게 여러 제출 버튼 장고 양식을 만들 수 있습니까?

PYTHON

어떻게 여러 제출 버튼 장고 양식을 만들 수 있습니까?

나는 전자 우편에 대한 하나의 입력 양식과 뉴스 레터 구독 및 탈퇴 버튼 2 개가있는 양식이 있습니다.

<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 사전에 없습니다. 그렇지 않으면 버튼 값을 얻을 수 있습니까?

해결법

  1. ==============================

    1.유효성 검사 전에 clean_email 메소드에서 self.data를 사용하여 POST 데이터에 액세스 할 수 있습니다. 어떤 단추를 눌렀는지에 따라 newsletter_sub 또는 newsletter_unsub라는 키가 있어야합니다.

    유효성 검사 전에 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
    
  2. ==============================

    2.예 :

    예 :

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

    3.당신도 이렇게 할 수 있습니다.

    당신도 이렇게 할 수 있습니다.

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

    암호

  4. ==============================

    4.지금은 오래된 질문입니다. 그럼에도 불구하고 나는 똑같은 문제를 안고 있고 저에게 잘 맞는 해결책을 발견했습니다 : 나는 MultiRedirectMixin을 썼습니다.

    지금은 오래된 질문입니다. 그럼에도 불구하고 나는 똑같은 문제를 안고 있고 저에게 잘 맞는 해결책을 발견했습니다 : 나는 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
    
  5. ==============================

    5.동일한 전망에 1 개의 URL! 그렇게!

    동일한 전망에 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>
    
  6. from https://stackoverflow.com/questions/866272/how-can-i-build-multiple-submit-buttons-django-form by cc-by-sa and MIT license