首页 > 解决方案 > django 遍历作为查询集项目的列表

问题描述

我有一个由我的一个模型上的方法生成的列表。在主页上它工作得很好,但是当我进入一个项目的详细视图时,我可以访问该项目的所有部分,因为它们是模型的直接字段,但我无法访问列表中的项目。

模型:

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)
    slug = models.SlugField(max_length=64)
    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)

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.title)
        super(Project, self).save(*args, **kwargs)

    @property
    def updates(self):
        updates = []
        sequence_id = 1
        categories = set(self.update_set.all().values_list(
                         'category__id', flat=True))

        for cat_id in categories:
            a = Update.objects.filter(
                project=self, category__id=cat_id).order_by('added').last()
            if cat_id == sequence_id:
                updates.append(a)
            else:
                for i in range(cat_id - sequence_id):
                    updates.append('null')
                updates.append(a)
                sequence_id = cat_id
            sequence_id += 1
        return updates

class Update(models.Model):

    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    category = models.ForeignKey(UpdateCategory, on_delete=models.PROTECT)
    update = models.TextField(max_length=240, blank=True)
    added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.update

观点很简单:

class ProjectDetailView(DetailView):

    template_name = 'project_portal/project_detail.html'
    queryset = Project.objects.all()

这是我正在使用的动态网址:

path('project/<int:pk>/',
     ProjectDetailView.as_view(), name='project_detail'),

至于模板,我迷路了,这是我尝试过的事情之一:

<!DOCTYPE html>
{% extends "project_portal/base.html" %}
{% block home %}
<div id="main">
  <div id="content">
    <div>
      <h1>{{ object.title }}</h1>
      <h1>hello</h1>
      {% if object_list %}
      {% for item in updates %}

      <p>{{ item }}</p>
      {% endfor %}
      {% else %}
      <h2>No records found for this project</h2>
      {% endif %}
    </div>
  </div>
</div>
{% endblock %}

我需要做什么才能访问生成的“更新”列表?

标签: pythondjango

解决方案


update是模型实例的一个属性,您需要像任何其他属性一样从那里访问它。另请注意,object_list详细视图中没有。

<div>
  <h1>{{ object.title }}</h1>
  <h1>hello</h1>
  {% for item in object.updates %}
  <p>{{ item }}</p>
  {% endfor %}
</div>

推荐阅读