在Django Detail Generic View中显示ManyToManyField

时间:2017-08-17 10:14:57

标签: django django-models django-views

在我的Django项目中,我有两个模型 - 程序和循环 - 它们是ManyToMany关系的输出,因此一个程序可以有很多循环,同时循环可以是许多不同程序的一部分。

从通用列表视图中,用户可以选择一个程序并访问该程序的详细信息视图,其中我应该显示所选程序中包含的所有周期。

views.py

class AllProgramsView (generic.ListView):
    template_name = 'programs/index.html'
    context_object_name = 'programs_list'

    def get_queryset(self):
        return Program.objects.all()


class ProgramDetailView (generic.DetailView):
    model = Program
    template_name = 'programs/program.html'

在models.py

class Cycle(models.Model):
    cycle_name = models.CharField(max_length=150)
    cycle_description = models.CharField(max_length=250)
    steps = models.ManyToManyField(Step)

    def __str__(self):
        return self.cycle_name + "  --  " + self.cycle_description

class Program(models.Model):
    program_name = models.CharField(max_length=50)
    program_description = models.CharField(max_length=250)
    cycles = models.ManyToManyField(Cycle)
    is_favourite = models.BooleanField(default="False")

    def get_absolute_url(self):
        return reverse('programs:program', kwargs={'pk': self.pk})

    def __str__(self):
        return self.program_name

在html模板中,program.html

<div class="bg-white">
  <div class="container text-center text-muted">
    <div class="row">
    {% if cycle %}
          {% for cycle in program %}
         <div class="col-sm-4 py-4">
         <div class="card">
           <p><h5>{{ cycles.cycle_name }}</h5></p>
           <p class="card-text">{{ cycles.cycle_description }}</p>
           <a href="" class="btn btn-secondary">Modify it</a>
         </div>
        {% endfor %}
    {% else %}
      <div class="bg-white">
         <p>No Cycles Found</p>
       </div>
    {% endif %}
  </div>
</div>

问题是详细信息页面中没有显示循环,即使我在数据库中保存了循环保存的程序,因此它们应该显示。 代码中是否有错误?

非常感谢你!

1 个答案:

答案 0 :(得分:1)

class ProgramDetailView (generic.DetailView):
    model = Program
    template_name = 'programs/program.html'
    context_object_name = 'sp'
    slug_field = 'id'

    def get_context_data(self, **kwargs):
        kwargs['cycles'] = self.get_object().cycles.all()
        return super(ProgramDetailView, self).get_context_data(**kwargs)

class ProgramDetailView (generic.DetailView):
    model = Program
    template_name = 'programs/program.html'
    context_object_name = 'sp'
    slug_field = 'id'

HTML

<div class="bg-white">
  <div class="container text-center text-muted">
    <div class="row">
    {% if sp %}
       {% for cycle in sp.cycles.all %}
         <div class="col-sm-4 py-4">
         <div class="card">
           <p><h5>{{ cycles.cycle_name }}</h5></p>
           <p class="card-text">{{ cycles.cycle_description }}</p>
           <a href="" class="btn btn-secondary">Modify it</a>
         </div>
        {% endfor %}
    {% else %}
      <div class="bg-white">
         <p>No Cycles Found</p>
       </div>
    {% endif %}
  </div>
</div>
相关问题