【问题标题】:Django - how to control and filter related objectsDjango - 如何控制和过滤相关对象
【发布时间】: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


    【解决方案1】:

    您必须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
    

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

    如果您要捕获 slug,您的过滤器查询将是:

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

    【讨论】:

    • 感谢您的重播 .. 我试过这个,但当我在模板中使用上下文“课程”时没有给我任何输出或错误
    • 你能打印你从 kwargs 得到的 slug 吗?
    • 这是模型类的 slug .. slug = models.SlugField(blank=True, unique=True) def save(self, *args, **kwargs): self.slug = slugify(self.category_name) return super(Categories, self).save(*args, **kwargs) 这是我的 urls.py path('tutorials/&lt;slug:slug&gt;/', views.CategoriesDetailView.as_view(), name='category'),
    • 在您看来,kwargs 中的 slug 是什么?可以打印一下吗?
    • 对不起,我是新手 :D,我不知道如何从 kwargs 获得 slug
    猜你喜欢
    • 2010-09-20
    • 2019-02-14
    • 2018-11-18
    • 2016-05-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多