2012-03-14 74 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