2017-04-21 6 views
1

Ich habe ein Formular erstellt, in dem Benutzer einen Datumsbereich eingeben. Einmal gesendet, muss es dann eine Liste von meiner Datenbank von Leuten all jene zurückgeben, deren Geburtstage innerhalb dieses Datumsbereichs sind. Ich bin ziemlich neu in Django und habe es versucht, aber ich verstehe nicht, wie ich mein "start_date & end_date" als Kwargs von meinem Formular an ListView übergeben kann.So zeigen Sie Formularabfrageergebnisse in einem ListView an

views.py:

class BirthdaysRangeFormView(FormView): 
    template_name = 'snippets/date_selection_form.html' 
    form_class = datefilterform 

    def get_form_kwargs(self): 
     kwargs = super(BirthdaysRangeFormView, self).get_form_kwargs() 
     kwargs ['request'] = self.request 
     return kwargs 

    def get_context_data(self, **kwargs): 
     context = super().get_context_data(**kwargs) 
     context['title'] = "Date Selection" 
     context['header'] = "Please select date range" 
     return context 

    def form_valid(self, form): 
     self.start_date = (form.cleaned_data['start_date'], People.next_birthday) 
     self.end_date = (form.cleaned_data['end_date'], People.next_birthday) 
     return self.redirect_to_results() 

    def redirect_to_results(self): 
     self.success_url = "dates:birthdays" 
     return redirect(
      self.get_success_url(), 
     ) 


class BirthdaysListView(BirthdaysRangeFormView, ListView): 
    template_name = 'dates/birthdays.html', 
    context_object_name = "person" 
    person = True 
    # queryset = People.objects.order_by('next_birthday') 


    def get_queryset(self): 
     test = '' 

forms.py:

class datefilterform(forms.Form): 
    model = People 



    start_date = forms.DateField(
     input_formats=['%d/%m/%Y'], 
     widget=DateTimePicker(
      options={"format": "DD/MM/YYYY", "pickTime": False}) 
    ) 

    end_date = forms.DateField(
     input_formats=['%d/%m/%Y'], 
     widget=DateTimePicker(
      options={"format": "DD/MM/YYYY", "pickTime": False}) 
    ) 

    People.next_birthday = start_date 
    People.next_birthday = end_date 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request') 
     super(datefilterform, self).__init__(*args, **kwargs) 

     self.helper = FormHelper() 
     self.helper.form_id = 'main_form' 
     self.helper.form_class ='form-horizontal' 
     self.helper.label_class = 'col-lg-3' 
     self.helper.field_class = 'col-lg-8' 

     self.helper.layout = Layout(

      'start_date', 
      'end_date', 
      FormActions(
       Submit('submit', 'Submit'), 
       Button('cancel', 'Cancel', css_class='cancel') 
      ) 
     ) 

    def clean(self): 

     cleaned_data = super().clean() 
     start_date = cleaned_data.get("start_date") 
     end_date = cleaned_data.get("end_date") 

     if not check_end_date(start_date, end_date): 
      raise forms.ValidationError(
       "Incorrect Dates entered, End date must be after start date" 
      ) 

Ich habe vor einfache Listviews getan, aber ich verstehe nicht, wie "Bitte" in der Klasse zu verwenden, basierte Ansichten.

Antwort

0

Sie können in Ihren klassenbasierten Ansichten einfach auf self.request zugreifen.

Vielmehr folgende Sie Format, so dass Sie sowohl POST und in der gleichen Ansicht GET Anfrage verarbeiten kann.

class MyView(FormView): 
    template_name = 'some_template.html' 
    success_url = '...' 
    form_class = MyForm 

    def get(self, request, *args, **kwargs): 
     pass 

    def post(self, request, *args, **kwargs): 
     pass 


    def form_invalid(self, form, **kwargs): 
     pass 


    def form_valid(self, form, **kwargs): 
     pass 
    ..... 
+0

Ich verstehe nicht, was du damit meinst, wie es in der def get_queryset oder ein def i verwendet habe zu gehen braucht 'self.request = kwargs.get (‚start_date‘, um zu versuchen, month_start (timezone.now()). Date() .strftime ('% Y-% m-% d') 'self.request = kwargs.get ('end_date', month_end (timezone.now()). date(). strftime ('% Y-% m-% d') ) 'wäre es etwas in dieser Richtung sein –

+0

Sie nächste Ansicht von einer Ansicht aufrufen? Das ist eine schlechte Übung @LewisCollins Ich habe einen Code oben vorbereitet. Es mag hilfreich für dich sein. –

+0

Aus dem obigen Code verstehe ich nicht, wie ich alles in einer Ansicht übergeben könnte –

Verwandte Themen