VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Django多条件筛选查询(4)

""" 获取当前url,进行值修改拼接 :param current_url: http://127.0.0.1:8000/test/goods-0-0-0-0.html :param index: :return: """ a_href_active = """ <a href="{href}" class="active">【{name}】</a> """ a_href_unactive = """ <a href="{href}">{name}</a> """ url_part_list = current_url.split('-') if index == len(url_part_list)-1: # 最后一个带.html要特殊处理 if url_part_list[index] == str(item['id']) + '.html': a_href = a_href_active else: a_href = a_href_unactive url_part_list[index] = str(item['id']) + '.html' else: # print(item['id'], type(item['id'])) # item['id']是int类型 if url_part_list[index] == str(item['id']): a_href = a_href_active else: a_href = a_href_unactive url_part_list[index] = str(item['id']) href = '-'.join(url_part_list) if index in range(1, 4): a_href = a_href.format(href=href, name=item['name']) if index == len(url_part_list)-1: a_href = a_href.format(href=href, name=item['status']) return mark_safe(a_href)

多对多模型进行筛选

模型

# 课程分类
class Category(models.Model):
    weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)
    name = models.CharField(max_length=32, verbose_name='分类名称')

    class Meta:
        verbose_name = '分类方向'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


# 编程语言,一个课程分类里可能有多种编程语言,一种编程语言可能存在不同的课程分类
class Code(models.Model):
    weight = models.IntegerField(default=0, verbose_name='权重(按从大到小排列)')
    name = models.CharField(max_length=32, verbose_name='编程语言')
    category = models.ManyToManyField(Category, related_name='codes', verbose_name='课程分类')

    class Meta:
        verbose_name = '编程语言'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


# 课程详情
class Course(models.Model):
    STATUS_CHOICE = (
        (0, '下线'),
        (1, '上线')
    )

    LEVEL_CHOICE = (
        (1, '初级'),
        (2, '中级'),
        (3, '高级')
    )

    status = models.IntegerField(choices=STATUS_CHOICE, default=1, verbose_name='状态')
    level = models.IntegerField(choices=LEVEL_CHOICE, default=1, verbose_name='难度级别')
    category = models.ForeignKey(Category, null=True, blank=True, related_name='courses', verbose_name='课程分类')
    weight = models.IntegerField(default=0, verbose_name='权重(按从大到小排列)')
    title = models.CharField(max_length=32, verbose_name='标题')
    summary = models.CharField(max_length=100, verbose_name='简介')
    image = models.ImageField(upload_to='images/course/%Y/%m', verbose_name='图片')
    video_url = models.CharField(max_length=256, verbose_name='视频地址')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    class Meta:
        verbose_name = '课程详情'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title

路由

urlpatterns = [
    # 访问形式http://127.0.0.1:8000/test/course-0-0-0.html,
    # 第一个0代表课程分类,第二个0代表编程语言,第三个0代表课程级别
    # 0代表全部,然后递增,当选择课程分类中的第一项,第一个0就会变成1
    url(r'^course-(?P<code_id>\d+)-(?P<category_id>\d+)-(?P<level_id>\d+).html', course, name='course'),
]

视图

def course(request, *args, **kwargs):
    print(args, kwargs)  # () {'code_id': '0', 'category_id': '0', 'level_id': '0'}
    request_path = request.path  # http://127.0.0.1:8000/test/course-0-0-0.html

    # 筛选字典
    filter_dict = dict()

    code_list = Code.objects.all().values('id', 'name')
    category_list = Category.objects.all().values('id', 'name')
    level_list = list(map(lambda x: {'id': x[0], 'name': x[1]}, Course.LEVEL_CHOICE))

    if kwargs['code_id'] == '0':
        if kwargs['category_id'] != '0':
            category_list = Category.objects.filter(id=kwargs['category_id']).values('id', 'name')
            category = get_object_or_404(Category, id=kwargs['category_id'])
            # 分类不是全部,得到这个分类对应的所有编程语言
            code_list = category.codes.values('id', 'name')
            # 筛选这一分类
            filter_dict['category'] = category
    else:
        # 如果编程语言不为0,则获取对应的编程语言
        code = get_object_or_404(Code, id=kwargs['code_id'])
        # 得到编程语言对应的所有分类
        categories = code.category.all()
        category_list = categories.values('id', 'name')
        # 筛选课程在这些分类的结果
        filter_dict['category__in'] = categories
        if kwargs['category_id'] != '0':
            # 如果分类不为0,对分类进行筛选,得到该编程语言和该分类下的结果
            category = get_object_or_404(categories, id=kwargs['category_id'])
            code_list = category.codes.values('id', 'name')
            filter_dict['category'] = category

    if kwargs['level_id'] != '0':
        filter_dict['level'] = int(kwargs['level_id'])

    filter_dict['status'] = 1

    course_list = Course.objects.filter(**filter_dict)
    return render(request, 'course.html',
                  {
                      'category_list': category_list,
                      'code_list': code_list,
                      'level_list': level_list,
                      'course_list': course_list,
                  })

模板

<!DOCTYPE html>
{% load course_active %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>多条件筛选多对多模型</title>
</head>
<body>

<h3>选择:</h3>

<p>
    编程语言:
    {% active_all request.path 1 %}
    {% for code in code_list %}
        <!--{{ code }}-->
        {% active request.path code 1 %}
    {% endfor %}
</p>

<p>
    课程分类:
    {% active_all request.path 2 %}
    {% for category in category_list %}
        <!--{{ category }}-->
        {% active request.path category 2 %}
    {% endfor %}
</p>

<p>
    课程信息:
    {% active_all request.path 3 %}
    {% for level in level_list %}
        <!--{{ level }}-->
        {% active request.path level 3 %}
    {% endfor %}
</p>

<h3>视频:</h3>
{% for course in course_list %}
    <a class="item" href="{{ course.video.url }}">
        <img src="/media/{{ course.image }}" width="300px" height="200px">
        <p>《{{ course.title }}》{{ course.summary }}</p>
        <hr>
    </a>
{% endfor %}

</body>
</html>

链接生成模板标签

应用下创建templatetags包,创建 course_active.py 文件,用来放置模板标签

from django.utils.safestring import mark_safe
from django import template


register = template.Library()


@register.simple_tag
def active_all(current_url, index):
    """
    获取当前url, course-1-1-2.html
    :param current_url:
    :param index:
    :return:
    """
    url_part_list = current_url.split('-')
    if index == 3:
        if url_part_list[index] == '0.html':
            temp = '<a href="%s" class="active">【全部】</a>'
        else:
            temp = '<a href="%s"">全部</a>'

        url_part_list[index] = '0.html'
    else:
        if url_part_list[index] == '0':
            temp = '<a href="%s" class="active">【全部】</a>'
        else:
            temp = '<a href="%s"">全部</a>'

        url_part_list[index] = '0'

    url_str = '-'.join(url_part_list)

    temp = temp % (url_str, )
    return mark_safe(temp)


@register.simple_tag
def active(current_url, item, index):
    """
    course-0-0-1.html
    :param current_url:
    :param item:
    :param index:
    :return:
    """
    # print('\n当前访问地址:', current_url, item, index, type(index))
    url_part_list = current_url.split('-')
    # print(url_part_list)  # ['/test/course', '0', '0', '0.html']
    if index == 3:
        if str(item['id']) == url_part_list[3].split('.')[0]:  # 如果当前标签被选中
            temp = '<a href="%s" class="active">【%s】</a>'
        else:
            temp = '<a href="%s"">%s</a>'

        url_part_list[index] = str(item['id']) + '.html'  # 拼接对应位置的url

    else:
        if str(item['id']) == url_part_list[index]:
            temp = '<a href="%s" class="active">【%s】</a>'
        else:
            temp = '<a href="%s">%s</a>'

        url_part_list[index] = str(item['id'])

    url_str = '-'.join(url_part_list)  # 拼接整体url
    # print(url_str)
    temp