Django - 如何控制和过滤相关对象

Django - how to control and filter related objects

我有两个模型

注意:为了简化问题,我删除了一些代码

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 category' 这很好用,例如它只会显示 'javascript courses'.

问题是我想过滤课程但是因为我使用这样的相关对象让我在视图上没有上下文所以我可以玩

所以要么我做的方式是错误的,这就是为什么它限制了我,还有另一种好方法我希望你告诉我,或者这是一个好方法,我可以做一些事情来过滤并玩 'courses' 个对象

我搜索并找到了这个,但这给了我所有 'courses' 不仅是与特定 'Category'

相关的那个
def get_context_data(self, **kwargs):
    context = super(CategoriesDetailView, self).get_context_data(**kwargs)
    context['course'] = Courses.objects.all().select_related("category")
    return context

您必须 filter Courses 模型才能根据您的类别获取课程。

您必须在您的视图中使用类似的查询:

def get_context_data(self, **kwargs):
    context = super(CategoriesDetailView, self).get_context_data(**kwargs)
    context['course'] = Courses.objects.filter() # Your filter query here
    return context

现在您的过滤器查询可以基于您正在捕获的 kwargs url

如果您捕获的是鼻涕虫,您的过滤器查询将是:

slug = self.kwargs.get('slug')
# assuming that you've a field called slug in Category model
Courses.objects.filter(category__slug=slug)