Django使用属性装饰器访问Model

时间:2019-07-17 14:55:50

标签: python django

如何使用属性装饰器访问方法中的数据。我可以在外壳中访问它,这是我所需要的,但是在我的网站中却空白。

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

这将以正确的顺序返回第一个项目的正确数据。我需要怎么做才能使其出现在网站中?

3 个答案:

答案 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中的项目,这由方法与属性装饰器共同提供。我希望这很清楚,如果有人找到需要帮助的内容。