将 django-filter 与 DetailView 类一起使用

DAM*_*225 2 django django-generic-views django-filter

我想用 Django 和 django-filter 制作一个动态过滤表单,如 stackoverflow 过滤器 在此输入图像描述

我想在由 DetailView 渲染的模板上使用这个过滤器,现在的问题是我搜索了很多,但没有找到如何实现这一点的示例

在我的模板中,我列出了与“材料”类相关的所有“课程”,我想在同一模板上制作一个表单,以便我可以过滤此列表

我的模板

{% for course in material_detail.courses_set.all %}
<div class="course">
    <h5>{{ course.course_name }}</h5>
    <p>{{ course.course_description }} </p>            
</div>
<hr/>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我有两个模型“材料”和“课程”我的 models.py

class Materials(models.Model):
    materials_name          = models.CharField(max_length=200)
    materials_description   = models.CharField(max_length=200, null=True)
    slug_material           = models.SlugField(blank=True, unique=True)


class Courses(models.Model):
    course_name             = models.CharField(max_length=200)
    course_description      = models.CharField(max_length=300, null=True)
    material                = models.ForeignKey(Materials, on_delete = models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

我有一个类 DetailView myviews.py

class MaterialsDetailView(DetailView):
    model               = Materials
    template_name       = 'tuts/material.html'
    context_object_name = 'material_detail'
Run Code Online (Sandbox Code Playgroud)

我制作了一个filters.py 文件并在其上编写了此代码,但我不知道如何将其与我的Class DetailView 链接

import django_filters

from .models import Materials

class CourseFilter(django_filters.FilterSet):

class Meta:
    model = Materials
    fields = ['courses__course_name', 'courses__course_description']
Run Code Online (Sandbox Code Playgroud)

注意: 我的模型和模板上有更多代码,我将其删除以使代码非常简单

ude*_*tha 5

您只是显示与材料相关的课程列表。因此您可以使用 过滤相关课程。请注意,我使用的是而不是f = CourseFilter(self.request.GET, queryset=Courses.objects.filter(material=material_pk))CourseFilterMaterialFilter

视图.py

class MaterialsDetailView(DetailView):
    model = Materials
    template_name = 'tuts/material.html'
    context_object_name = 'material_detail'

    def get_context_data(self, **kwargs):
        context_data = super(MaterialsDetailView, self).get_context_data()
        material_pk = self.kwargs.get('pk', None)
        f = CourseFilter(self.request.GET, queryset=Courses.objects.filter(material=material_pk))
        context_data['filter'] = f
        return context_data
Run Code Online (Sandbox Code Playgroud)

过滤器.py

class CourseFilter(django_filters.FilterSet):
    class Meta:
        model = Courses
        fields = []
    course_name = django_filters.CharFilter(field_name="course_name", lookup_expr="icontains")
    course_description = django_filters.CharFilter(field_name="course_description", lookup_expr="icontains")
Run Code Online (Sandbox Code Playgroud)

在您的模板中,您可以访问所有过滤后的查询集以及filter.qs相应的表单filter.form

啧啧/material.html

<form method="GET">
    {{ filter.form.as_p }}
    <input type="submit" />
</form>
{% for course in filter.qs %}
<div class="course">
    <h5>{{ course.course_name }}</h5>
    <p>{{ course.course_description }} </p>
</div>
<hr/>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)