我想能够产生一个下拉菜单在我的模板与一个独特的主题列表。你知道吗
主题填充在admin中,而不是在主题选项中硬编码。你知道吗
一门课程可以有多个科目,也可以只有一个科目。例如:
课程名称=Django 主题=技术
课程名称=Python 主题=技术
课程名称=会计学 主题=商务
课程名称=电子商务 主题=技术、商业
CourseListView对应于课程_列表.html模板。你知道吗
models.py
:
class Subject(models.Model):
SUBJECT_CHOICES = ()
name = models.CharField(max_length=20,choices=SUBJECT_CHOICES, unique=True)
def __str__(self):
return self.name
class Course(models.Model):
SKILL_LEVEL_CHOICES = (
('Beginner', 'Beginner'),
('Intermediate', 'Intermediate'),
('Advanced', 'Advanced'),
)
slug = models.SlugField()
title = models.CharField(max_length=120)
description = models.TextField()
allowed_memberships = models.ManyToManyField(Membership)
created_at = models.DateTimeField(auto_now_add=True)
subjects = models.ManyToManyField(Subject)
skill_level = models.CharField(max_length=20,choices=SKILL_LEVEL_CHOICES, null=True)
visited_times = models.IntegerField(default=0)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('courses:detail', kwargs={'slug': self.slug})
@property
def lessons(self):
return self.lesson_set.all().order_by('position')
你知道吗
views.py
:
class CourseListView(ListView):
model = Course
def get_queryset(self):
qs = super().get_queryset()
title_contains_query = self.request.GET.get('title_contains')
view_count_min = self.request.GET.get('view_count_min')
view_count_max = self.request.GET.get('view_count_max')
date_min = self.request.GET.get('date_min')
date_max = self.request.GET.get('date_max')
skill_level_query = self.request.GET.get('skill_level')
if title_contains_query:
qs = qs.filter(title__icontains=title_contains_query)
if view_count_min:
qs = qs.filter(visited_times__gte=view_count_min)
if view_count_max:
qs = qs.filter(visited_times__lte=view_count_max)
if date_min:
qs = qs.filter(created_at__gte=date_min)
if date_max:
qs = qs.filter(created_at__lte=date_max)
if skill_level_query:
qs = qs.filter(skill_level=skill_level_query)
return qs
期望输出:
我尝试在我的模板中编写一个for循环,它确实成功地返回了主题,但它们不是唯一的或只显示一次。你知道吗
{% for item in object_list %}
<h2>{{ item.subjects.all}}</h2>
<ul>
{% for sub in item.subjects.all %}
<li><a href="#" id="">{{ sub.name }}</a></li>
{% endfor %}
</ul>
{% endfor %}
你知道吗 结果: 你知道吗
<QuerySet [<Subject: Business>]>
Business
<QuerySet [<Subject: Technology>]>
Technology
<QuerySet [<Subject: Technology>]>
Technology
<QuerySet [<Subject: Business>]>
Business
我更喜欢使用for循环来生成独特的结果,但是也许可以使用django-select2或者使用带有model select或multiple model select的表单来完成?有人能为循环或这些方法之一提供一些代码吗?你知道吗
如果能帮上忙,我将不胜感激。你知道吗
我在这里看到两种解决方案:
第一种方法是简单地获取
Subject
模型中输入的所有值,但不能使用视图中使用的所有过滤器,只能使用关于标题的过滤器。你知道吗为此,只需使用:
另一个选项是在QuerySet上使用^{} 方法,该方法过滤并删除其中的重复项。像这样使用:
qs = qs.distinct()
希望有帮助!你知道吗
相关问题 更多 >
编程相关推荐