2017-04-21 12 views
1

ユーザーが日付範囲を入力するフォームを作成しました。一度投稿すると、誕生日がその日付範囲内にあるすべての人のデータベースからリストを返す必要があります。私はDjangoをかなり新しくしていますが、私の "start_date & end_date"をkwargsとしてListViewに渡す方法を理解していません。フォーム照会結果をリストビューに表示する方法

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

私は前に簡単なリストビューを行ってきたが、私は、クラスベースのビューで "要求" を使用する方法を理解していません。

答えて

0

クラスベースのビューでself.requestに簡単にアクセスできます。

次の形式ではなく、POSTとGETの両方の要求を同じビューで処理できるようにします。

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

私はあなたのようなもので何を意味するのか理解していない、それはデフget_querysetに行くか、DEFなどを取得する必要がない私は、 'self.request = kwargs.get(「START_DATE」を試すために使用さでしたが、) ' ' 'self.request = kwargs.get( 'end_date'、 month_end(timezone.now))は、 ())。日付()。strftime( '%Y-%m-%d') ) 'これはこれらの行に沿ったものでしょうか? –

+0

あなたは1つのビューから次のビューを呼び出していますか?それは悪い練習です@LewisCollins 私は上記のコードを用意しました。彼があなたに役立つかもしれません。 –

+0

上記のコードから、私はそれを一度にすべて渡すことができるとは思わない –

関連する問題