আমি কীভাবে একাধিক জমা বোতাম জঙ্গো ফর্ম তৈরি করতে পারি?


155

আমার কাছে ইমেলের জন্য একটি ইনপুট এবং নিউজলেটার থেকে সাবস্ক্রাইব করতে এবং সাবস্ক্রাইব করতে দুটি জমা বোতাম জমা দেওয়া রয়েছে:

<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',)

আমাকে অবশ্যই আমার নিজের ক্লিন_মেল পদ্ধতিটি লিখতে হবে এবং আমার জানতে হবে কোন বোতামটি ফর্মটি জমা দিয়েছিল। জমা দেওয়ার বোতামের মান self.cleaned_dataঅভিধানে নেই। আমি কি অন্যথায় বোতামের মান পেতে পারি?

উত্তর:


96

আপনি ব্যবহার করতে পারেন self.dataমধ্যে clean_emailপদ্ধতি বৈধতা আগে পোস্ট ডেটা অ্যাক্সেস করতে। এটিতে একটি বোতাম চাপানো 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
আপনি একটি টীকা উদাহরণ দিতে পারেন? এটি সত্যিই সহায়তা করবে
ঝাড়উড

9
আমি মনে করি না যে cleanমডেল স্তরের যুক্তি করার জন্য সঠিক ধরণের জায়গাটি সঠিক নয়। এটি বিশেষত একটি ফর্ম পরিষ্কার করার এবং ValidationErrorএকাধিক ইনপুট বিস্তৃত এমন কোনও সন্ধানের জন্য । সোভেনের উত্তরটি সঠিক দিকনির্দেশে আরও বেশি, তবে এখনও সর্বোত্তম উত্তরের প্রয়োজন নেই
প্যাট্রিক

8
নিরাপত্তা ঝুঁকি! ফর্মটি বৈধ হওয়ার আগে ডেটাবেজে পরিবর্তন করতে ফর্ম ডেটা ব্যবহার করা বিপজ্জনক।
কোয়ান্ট মেট্রোপলিস

1
কোন বোতামটি চাপছিল তার উপর নির্ভর করে আপনি বিভিন্ন ধরণের বৈধতা চালাতে চাইতে পারেন। সেক্ষেত্রে কোনও "সুরক্ষা" প্রভাব নেই।
sureshvv

230

উদাহরণ:

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

1
ক্লিন_এক্সএক্সএক্স বৈধতা পদ্ধতিগুলির মধ্যে কি অনুরোধ উপলব্ধ?
sureshvv

এটি কোন পদ্ধতিতে যাওয়া উচিত?
জন ম্যাকক্লুং

1
@JonMcClung ইনসাইড def post(self, request, *args, **kwargs)
এ কালী

23

আপনি এটির মতোও করতে পারেন,

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

form1.as_p কখন এটি ব্যবহার করবেন ?? ফর্মের বৈধতা যাচাই করার সময় মতামতগুলিতে, আমি ইচ্ছা করি ... form1.is_ માન્ય () তাহলে এটি করতে পারুন, form2.is_ માન્ય () এটি করুন ..
টিলাপ্রিমে

5

এটি এখন একটি পুরানো প্রশ্ন, তবুও আমার একই সমস্যা ছিল এবং আমার জন্য কার্যকর এমন একটি সমাধান খুঁজে পেয়েছি: আমি মাল্টিআরডাইরেক্টমিক্সিন লিখেছি।

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

আপনি কোথায় এবং ঠিক কীভাবে মাল্টিআরডাইরেক্টমিক্সিন ব্যবহার করবেন? দয়া করে একটি উদাহরণ দিয়ে বিস্তারিত বর্ণনা করুন।
সৌরভ কুমার

4

একই দৃশ্যে একটি ইউআরএল! তাই ভালো!

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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.