【问题标题】:How to properly use get_context_data with ListView to fetch related instances in Django如何正确使用 get_context_data 和 ListView 在 Django 中获取相关实例
【发布时间】:2018-02-28 10:40:00
【问题描述】:

我正在尝试使用 ListView 和 ContextMixin 创建视图,但我不确定这是否是正确的方法。目标是获取CourseImplementation 中的所有字段以及在TeacherCourseImplementation 中连接到它的teacherid
问题是在浏览器上打开模板时我看不到implement.teacherid 部分。想获取教师ID,不知道怎么办。

class ImplementView(generic.ListView):
    template_name = 'schedule/implement.html'
    context_object_name = 'all_implements'

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

    def get_context_data(self, **kwargs):
        context = super(ImplementView, self).get_context_data(**kwargs)
        context['teacherid'] = TeacherCourseImplementation.objects.all()
        return context

这是我的models.py

class CourseImplementation(models.Model):
    courseid = models.ForeignKey(Course, on_delete=models.CASCADE, db_column='courseid', )
    roomid = models.ForeignKey('Room', models.DO_NOTHING, db_column='roomid', blank=True, null=True)
    note = models.CharField(max_length=10, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'course_implementation'

    def __str__(self):
        return self.pk + ' - ' + self.courseid

class TeacherCourseImplementation(models.Model):
    teacherid = models.ForeignKey(Teacher, on_delete=models.CASCADE, db_column='teacherid', primary_key=True)
    course_impleid = models.ForeignKey(CourseImplementation, on_delete=models.CASCADE, db_column='course_impleid')
    p1 = models.IntegerField(blank=True, null=True)
    p2 = models.IntegerField(blank=True, null=True)
    p3 = models.IntegerField(blank=True, null=True)
    p4 = models.IntegerField(blank=True, null=True)
    p5 = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'teacher_course_implementation'
        unique_together = (('teacherid', 'course_impleid'),)

    def __str__(self):
        return self.pk + ' - ' + self.teacherid

这是我的模板:

<ul>
    {% for implement in all_implements %}
        <div class="col-sm-5 col-lg-5">
            <div class="thumbnail">
                <p>{{ implement.teacherid }} - {{ implement.courseid }}</p>
            </div>
        </div>
    {% endfor %}
</ul>

谁能帮我解决这个问题。谢谢。

【问题讨论】:

  • 你没有展示你的模板或说出你真正想要做什么。
  • 您的问题是什么?无论如何,ListView 已经包含了 ContextMixin。
  • 我刚刚编辑了我的问题。你能再看一下吗?
  • 不,因为你还没有说出问题所在。
  • 问题是在浏览器上打开模板时我看不到部分 implement.teacherid。想拿到teacherid不知道怎么办。

标签: python django django-views


【解决方案1】:

您可以使用implement.teachercourseimplementation_set.all() 访问TeacherCourseImplementation 项目implement 的相关TeacherCourseImplementation 项目(不要在模板中使用括号):

{% for implement in all_implements %}
    <div class="col-sm-5 col-lg-5">
        <div class="thumbnail">
            <p>{{ implement.courseid }}</p>
            {% for teacher_course_implementation in implement. teachercourseimplementation_set.all %}
              {{ teacher_course_implementation.teacherid }}
              ...
            {% endfor %}
        </div>
    </div>
{% endfor %}

有关更多信息,请参阅following relationships backwards 上的文档。

这将为查询集中的每个项目生成一个额外的查询。您可以使用prefetch_related 来避免这种情况。

def get_queryset(self):
    return CourseImplementation.objects.all().prefetch_related('teachercourseimplementation_set')

由于您通过CourseImplementation 实例访问所有TeacherCourseImplementation 实例,因此您无需覆盖get_context_data

【讨论】:

  • 非常感谢。我已经挣扎了一段时间。
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2019-08-11
  • 1970-01-01
  • 2016-03-30
  • 2016-02-09
相关资源
最近更新 更多