我有以下设置。我有教师,可以有很多学生。他们都是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')
答案 0 :(得分:1)
您可以从self.kwargs
获取pk:
context['reviews'] = Review.objects.filter(teacher_pk=self.kwargs['pk'])