Django视图:在详细视图中获取ListView

时间:2017-08-18 23:10:16

标签: django django-views

我有以下设置。我有教师,可以有很多学生。他们都是Django用户。学生可以为教师留下评论。我正在构建教师详细信息视图。这是网址/teachers/1,其中/teachers/是列表视图。

现在出现问题:

我希望用户在给定的教师视图中看到所有评论。这将对应于DetailedView中的“ListView”。 的 Urls.py

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.TeacherView.as_view(), name='detail'),
]

Models.py

class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Teacher')
    availability = models.BooleanField(default=False)


    def __str__(self):
        return self.user.username

class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Student')
    teacher = models.OneToOneField(Teacher, on_delete=models.PROTECT, related_name='Student')
    reviewed = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username

class Review(models.Model):
    teacher = models.OneToOneField(Teacher, on_delete=models.PROTECT, related_name='Teacher')
    student = models.OneToOneField(Student, on_delete=models.PROTECT, related_name='Student')
    star = models.IntegerField(default=5)
    body = models.TextField()

最后是主要问题 - views.py

class IndexView(ListView):
    # context_object_name = 'latest_teacher_list'

    def get_queryset(self):
        """Return the last five published questions."""
        return Teacher.objects.all()[:5]


class TeacherView(generic.DetailView):
    model = Teacher

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(TeacherView, self).get_context_data(**kwargs)
        # Add extra context from another model
        context['reviews'] = Review.objects.filter(teacher_pk=pk)
        return context

这不起作用,它抱怨pk未定义。它在我脑海中的作用是从URL获取 pk ,然后找到user.teacher.pk(或teacher.pk或teacher_pk)= pk的所有评论对象。

我试着玩** kwags并用pk替换,但没有成功。

此外,作为附加问题,我想显示平均评分。

我在考虑rating = Review.objects.filter(teacher_pk=pk).aggregate(Avg('star')

1 个答案:

答案 0 :(得分:1)

您可以从self.kwargs获取pk:

context['reviews'] = Review.objects.filter(teacher_pk=self.kwargs['pk'])