Django视图:在详细视图中获取ListView
我有以下设置。我有老师,可以有很多学生。他们都是Django用户。学生可以给老师留下评论。我正在构建教师详细视图。这是urlDjango视图:在详细视图中获取ListView,django,django-views,Django,Django Views,我有以下设置。我有老师,可以有很多学生。他们都是Django用户。学生可以给老师留下评论。我正在构建教师详细视图。这是url/teachers/1,其中/teachers/是列表视图 现在的问题是: 我希望用户留下的所有评论在给定的教师视图中可见。这将对应于DetailedView中的“ListView”。 url.py urlpatterns = [ url(r'^$', views.IndexView.as_view(), name='index'), url(r'^(?P&
/teachers/1
,其中/teachers/
是列表视图
现在的问题是:
我希望用户留下的所有评论在给定的教师视图中可见。这将对应于DetailedView中的“ListView”。
url.py
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.TeacherView.as_view(), name='detail'),
]
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()
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
最后是主要问题-views.py
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.TeacherView.as_view(), name='detail'),
]
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()
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的所有审阅对象
我试着玩**Kwag,用pk代替,但没有成功
另外,作为补充问题,我想显示平均评分
我想到的是
rating=Review.objects.filter(teacher\u pk=pk).aggregate(Avg('star')
你可以从self.kwargs
获得pk:
context['reviews'] = Review.objects.filter(teacher_pk=self.kwargs['pk'])