如何使用属性装饰器访问方法中的数据。我可以在外壳中访问它,这是我所需要的,但是在我的网站中却空白。
Models.py:
class Project(models.Model):
date_published = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
area = models.ForeignKey(Area, on_delete=models.PROTECT)
title = models.CharField(max_length=128, unique=True)
summary = models.CharField(max_length=256)
others = models.CharField(max_length=128, blank=True)
deadline = models.DateField(null=True, blank=True)
priority = models.ForeignKey(Priority, on_delete=models.PROTECT)
closed = models.DateTimeField(null=True, blank=True)
@property
def updates(self):
updates = []
categories = set(self.update_set.all().values_list(
'category__id', flat=True))
for cat_id in categories:
updates.append(Update.objects.filter(
project=self, category__id=cat_id).order_by('added').last())
return updates
def __str__(self):
return self.title
Views.py:
class ProjectView(ListView):
template_name = 'project_portal/home.html'
queryset = Project.objects.all()
我正在尝试在模板中使用以下内容:
<div class="box5">
{% for item in object_list %}
<table>
<tr>
<td>{{ item.updates }}</td>
</tr>
</table>
{% endfor %}
</div>
到目前为止,该框为空白。但是,我设法使用以下命令在Django shell中获取了该数据:
p = Project.objects.all()[0]
p.updates
这将以正确的顺序返回第一个项目的正确数据。我需要怎么做才能使其出现在网站中?
答案 0 :(得分:3)
您的问题似乎是您在视图的查询集中使用.values()
。这会给你一个清单。它在外壳中起作用的原因是因为您正在使用模型对象,因此能够获得updates
属性。因此,从.values()
queryset = Project.objects.all().values()
详细了解.values()
here。
答案 1 :(得分:1)
您确定模板具有名为project
的变量吗?尝试为project
更改object_list
或重写get_context_data
方法将项目传递到模板。
编辑:阅读完已编辑的问题后,我想您想做类似的事情。
<div class="box5">
{% for project in object_list %}
<table>
<tr>
{% for category_update in project.updates %}
<td>{{ category_update }}</td>
{% endfor %}
</tr>
</table>
{% endfor %}
</div>
如果您继续以错误的方式观看类别更新,请与我们分享您的类别模型。
答案 2 :(得分:0)
所以现在解决了。原始帖子中的Models.py和Views.py现在是正确的,导致其余问题的是模板,这是所需内容的简短版本:
{% block home %}
{% if object_list %}
{% for project in project_list %}
<div class="box1">
<h4>{{ project.title }}</h4>
<p>Project Status</p>
<div class="square"></div>
</div>
<div class="box5">
{% for item in project.updates %}
<table>
<tr>
<td>{{ item }}</td>
</tr>
</table>
{% endfor %}
</div>
{% endfor %}
{% endif %}
我在这里要说的是,有两个循环,一个循环遍历object_list中的项目,第二个循环遍历project.updates中的项目,这由方法与属性装饰器共同提供。我希望这很清楚,如果有人找到需要帮助的内容。