【发布时间】:2019-07-19 03:05:49
【问题描述】:
我有两个模型
注意:为了简化问题,我删除了一些代码
class Categories(models.Model):
category_name = models.CharField(max_length=100, null=True)
class Courses(models.Model):
course_name = models.CharField(max_length=200)
category = models.ForeignKey(Categories, on_delete = models.CASCADE,)
例如,如果我有 3 个类别(PHP、Python、Javascript),并且每个类别都有一个与之相关的课程,就像这样
PHP = php_course1, php_course2, php_course3
Python = python_course1, python_course2, python_course3
Javascript = javascript_course1, javascript_course2, javascript_course3
所以我想要的是,当有人点击任何类别时,它会将他带到另一个页面,其中只有与该类别相关的课程。
这就是我为实现这一目标所做的工作
views.py
class CategoriesListView(ListView):
model = Categories
template_name = 'category_list.html'
context_object_name = 'category_list'
class CategoriesDetailView(DetailView):
model = Categories
template_name = 'category_detail.html'
context_object_name = 'category_detail'
第一个模板'category_list.html'
{% for category in category_list %}
<a href="{% url 'category' category.slug %}" class="btn">{{ category.category_name }}</a>
{% endfor %}
第二个模板'category_detail.html'
{% for course in category_detail.courses_set.all %}
<h1> {{ course.course_name }} </h1>
{% ednfor %}
如果我点击“javascript 类别”,这将非常有效,例如它只会显示“javascript 课程”。
问题是我想过滤课程,但是因为我使用了这样的相关对象,所以我在视图上没有上下文,所以我可以玩
所以要么我做的方式是错误的,这就是它限制我的原因,还有另一种好方法我想让你告诉我,或者这是一个好方法,我可以做一些事情来过滤和播放带有“课程”对象
我搜索并找到了这个,但这给了我所有“课程”,而不仅仅是与特定“类别”相关的课程
def get_context_data(self, **kwargs):
context = super(CategoriesDetailView, self).get_context_data(**kwargs)
context['course'] = Courses.objects.all().select_related("category")
return context
【问题讨论】:
标签: django django-select-related django-related-manager