2012-03-14 71 views
1

有沒有辦法在查詢集中的數據進入模板之前以某種方式預先選擇數據?有這個'項目'模型連接到'project_phase',還有'project_phase_history'記錄可以跟蹤所有狀態變化。django:管理要在模板上顯示的數據

我正在構建關於這些數據的報告,並在一個頁面上顯示他們的所有項目,並且只想顯示過去幾天或最近一次提交的project_phase_history。

我試圖在視圖中莫名其妙地這樣做是這樣的:

projects_to_report_on = project.objects.filter(Q(current_phase__phase__id__in=[1,2,3,4]) & Q(role_sponsor__id = sponsor_id)) 
projects_to_report_on.current_phase.project_phase_history_set = projects_to_report_on.current_phase.project_phase_history.filter(...) 

,但是這並不能幫助,真的 - 所有的數據似乎跳進模板。

我結束了傳遞日期爲模板,生成報告是這樣的:

{% for s in p.current_phase.project_phase_history_set.all %} 
    {% if s.date_submitted >= status_start_date %} 

    <tr> 
    <td>{{ s.date_submitted }}</td> 
    <td>{{ s.date_end_fact|default_if_none:"-" }}</td> 
    </tr> 
     {% endif %} 
     {% endfor %} 

,但它不沒有我要找的靈活性。

class project(models.Model): 
    name = models.CharField(max_length=100, null=False, unique=True) 
    description = models.CharField(max_length=1024,null=True,blank=True) 
    current_phase = models.ForeignKey('project_phase', null=True, blank=True, related_name="current_phase") 

class project_phase(models.Model): 
    phase = models.ForeignKey('phases') 
    project = models.ForeignKey('project') 
    is_finished = models.BooleanField(default=False) 

class project_phase_history(models.Model): 
    project_phase = models.ForeignKey('project_phase') 
    date_start_plan = models.DateField(null=True, blank=False) 
    date_start_fact = models.DateField(null=True, blank=True) 

回答

0

這是你的問題:

projects_to_report_on.current_phase.project_phase_history_set = projects_to_report_on.current_phase.project_phase_history.filter(...) 

要設置的關係,一個QuerySet的反轉端的經理。這是行不通的。下面是用博客和入門車型爲例:

>>> print(Entry.objects.all()) 
[<Entry: Today>, <Entry: Hello>] 
>>> today = datetime.date.today() 
>>> print(Entry.objects.filter(pub_date__lt=today).all()) 
[<Entry: Hello>] 
>>> blog.entry_set = Entry.objects.filter(pub_date__lt=today()) 
>>> print(blog.entry_set.all()) 
[<Entry: Today>, <Entry: Hello>] 
>>> blog.entry_set = Entry.objects.none() 
>>> print(blog.entry_set.all()) 
[<Entry: Today>, <Entry: Hello>] 

因爲:

>>> blog.entry_set = Entry.objects.all() 
>>> type(blog.entry_set) 
<class 'django.db.models.fields.related.RelatedManager'> 

這意味着blog.entry_set仍然是一個經理,一個經理叫all只會返回所有記錄。所以不要這樣做。傳遞的QuerySet您的模板並使用:

history_set = projects_to_report_on.current_phase.project_phase_history_set.filter(...) 
# add it to the context as 'history_set' 

{% for s in history_set.all %} 

既然你需要循環項目及該項目的歷史,我想傳遞一個字典到模板:

from django.utils.datastructures import SortedDict 
# ... 
project_map = SortedDict() 
for project in projects_to_report_on: 
    project_map[project] = history_query_set_goes_here 
# ... 
return render(request, template, {'project_map': project_map}) 

而且然後在您的模板中:

{% for project, history_set in project_map.items %} 
    <h2>{{ project }}</h2> 
    <ol> 
    {% for history in history_set.all %} 
     <li>{{ history }}</li> 
    {% endfor %} 
    </ol> 
{% endfor %} 

SortedDict is documented on the Django wiki。它維護插入順序,所以如果您按照正確的順序從數據庫中檢索項目,它們將以相同的順序顯示。

+0

感謝您的評論。如果我爲單個項目生成報告,這將工作。由於我在報告中推送了大量項目並將兩個(報告/狀態)集合傳入到了它中,因此我將能夠在模板中將它們彼此綁定:(除非我的錯誤 – abolotnov 2012-03-14 20:26:53

+0

我'我已經編輯了我的答案,包括一個無害的方式來做到這一點。 – roam 2012-03-14 20:41:22

+0

這應該解決,謝謝! – abolotnov 2012-03-14 20:51:04