2015-07-10 84 views
0

我有一個名爲project的模型項目,其中每個項目都有一個標題,描述和日期,其中包含Fall或Spring以及一年(例如2012年秋季或2013年春季) 。我可以通過在我的頁面html中使用簡單的for循環來成功填充所有項目的頁面。不過,我希望在頁面中有一個帶有日期列表的ComboField(我可以指定),以便用戶選擇日期時,只有具有該日期的項目纔會顯示在頁面上。Django ComboField更改頁面內容

完成此操作的最佳方法是什麼?我應該使用Django表單項目,還是應該使用HTML select標記?如果最好使用HTML標籤,那麼如何實現這一點呢?

+0

這取決於您是否要重新加載頁面,以便應用過濾器? –

+0

重新加載頁面沒有問題。如果不重新加載是一個更好/更標準的做法,那麼我應該這樣做。 –

回答

1

一味地對其進行編碼,做這樣的事情在你的forms.py

from django import Forms 

from .models import Project 

class ProjectFilterForm(forms.Form): 

    range = forms.ChoiceField(choices=[], required=False) 

    def __init__(self, *args, **kwargs): 
     super(ProjectFilterForm, self).__init__(*args, **kwargs) 
     oldest = Project.objects.first() 
     newest = Project.objects.last() 
     if oldest and newest: 
      range_choices = [] 
      for year in range(oldest.date.year, newest.date.year+1): 
       range_choices.append('Spring {}'.format(year)) 
       range_choices.append('Fall {}'.format(year)) 
      self.fields['range'].choices = range_choices 


    def get_filtered_projects(self): 
     if not self.is_valid(): 
      return [] 
     choice = self.cleaned_data['range'] 
     parts = choice.split(' ') 
     month_range = [4,5,6,7,8,9] if parts[0] == 'Spring' else [10,11,12,1,2,3] 
     year = int(parts[1]) 
     return Project.objects.filter(date__year=year, date__month__in=month_range) 

包括形式爲模板的一部分,在視圖中使用get_filtered_projects生成的項目列表中提出,以顯示頁。