繁体   English   中英

django遍历作为queryset项的列表

[英]django iterate over a list that is an item of a queryset

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

模型:

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 %}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM