首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DetailView类使用django-filter

用DetailView类使用django-filter
EN

Stack Overflow用户
提问于 2019-07-17 23:09:23
回答 2查看 2.3K关注 0票数 1

我想用Django和django-过滤器做一个动态过滤表单,就像堆栈溢出过滤器一样。

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

在我的模板中,我列出了所有与“材料”类相关的“课程”,我想在同一个模板上做一个表单,这样我就可以过滤这个列表了。

我的模板

代码语言:javascript
复制
{% for course in material_detail.courses_set.all %}
<div class="course">
    <h5>{{ course.course_name }}</h5>
    <p>{{ course.course_description }} </p>            
</div>
<hr/>
{% endfor %}

我有两个模型‘材料’和‘课程’我的models.py

代码语言:javascript
复制
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)

我有一个类DetailView我的views.py

代码语言:javascript
复制
class MaterialsDetailView(DetailView):
    model               = Materials
    template_name       = 'tuts/material.html'
    context_object_name = 'material_detail'

我创建了一个filters.py文件并在其上编写了代码,但我不知道如何将它与类DetailView链接起来

代码语言:javascript
复制
import django_filters

from .models import Materials

class CourseFilter(django_filters.FilterSet):

class Meta:
    model = Materials
    fields = ['courses__course_name', 'courses__course_description']

注意:我的模型和模板上有更多的代码,为了使代码非常简单,我删除了它

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-02 15:36:55

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

views.py

代码语言:javascript
复制
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

filters.py

代码语言:javascript
复制
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")

在模板中,可以访问筛选的filter.qs中的所有querysetfilter.form中的相应表单。

tuts/实质性.tuts

代码语言:javascript
复制
<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 %}
票数 4
EN

Stack Overflow用户

发布于 2019-07-17 23:32:15

您可以使用ListView,然后使用get_queryset()进行筛选,然后调用get_context_data()将关键字参数作为上下文返回到模板中。

然后,只需为每个需要的过滤器连接一个单独的URL conf即可。您可以对每个视图使用相同的模板,只需链接到带有href的URL conf,将URL参数作为关键字参数传递,并在视图中使用Sel.kwargs‘’name_of_ it‘来访问它。然后在视图中通过该参数进行筛选,得到一个查询集,然后返回到模板。

博客示例:

代码语言:javascript
复制
class PostCategoryFilter(ListView):
    context_object_name = 'posts'
    template_name = 'blog/post_list.html'

    def get_queryset(self):
        return Post.objects.filter(category=self.kwargs['category_id'])

    def get_context_data(self, **kwargs):
        context = super(PostCategoryFilter, self).get_context_data(**kwargs)
        context['categories'] = Category.objects.all()
        context['filtered_category'] = Category.objects.get(id=self.kwargs['category_id'])

        return context

然后,您可以将上下文中的任何内容用作模板中的变量,例如,您将拥有类别和过滤后的帖子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57085070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档