简体   繁体   中英

django iterate over a list that is an item of a queryset

I have a list that is generated by a method on one of my models. On the home page it works wonderfully, however when I go to a detail view of one project I can access all the parts of that project as they are direct fields of the Model, but I can't access the items in the list.

Model:

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

The view is simple:

class ProjectDetailView(DetailView):

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

and here is the dynamic url that I am using:

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

As for the template, I'm lost, here is one of the things I have tried:

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

What do I need to do to access the "updates" list that gets generated?

update is a property of the model instance, you need to access it from there like any other attribute. Also note, there is no object_list in a detail view.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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