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

return mark_safe(temp.format(href=href)) @register.simple_tag def active(request_path, item, index): url_part_list = request_path.split('-') # 下面判断中,前面表示 event-0-1-5-1-,后面表示 3.html if url_part_list[index] == str(item['id']) or url_part_list[index] == str(item['id']) + '.html': temp = ''' <li class="nav-item"> <a href="{href}" class="nav-link active">{name}</a> </li> ''' else: temp = ''' <li class="nav-item"> <a href="{href}" class="nav-link">{name}</a> </li> ''' if index == 5: # 第五组有后缀.html,需单独处理 url_part_list[index] = str(item['id']) + '.html' else: url_part_list[index] = str(item['id']) href = '-'.join(url_part_list) if index == 1: """ event-1-0-0-0-0.html event-2-0-0-0-0.html event-3-0-0-0-0.html """ return mark_safe(temp.format(href=href, name=item['username'])) if index == 2: return mark_safe(temp.format(href=href, name=item['status_tag'])) if index == 3: return mark_safe(temp.format(href=href, name=item['level_tag'])) if index == 4: return mark_safe(temp.format(href=href, name=item['category_name'])) if index == 5: return mark_safe(temp.format(href=href, name=item['project_name']))

两级分类筛选

模型设计

from django.db import models
from django.utils.timezone import now


class GoodsTag(models.Model):
    name = models.CharField(max_length=64, verbose_name='标签名称')

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['name', ]
        verbose_name = '商品标签'  # 后台显示模型名称
        verbose_name_plural = verbose_name


# 智能家居、手机、电视、电脑
class FirstCategory(models.Model):
    name = models.CharField(max_length=64, verbose_name='分类名称')

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['name', ]
        verbose_name = '一级分类'
        verbose_name_plural = verbose_name


# 小米6、小米8、红米10
class SubCategory(models.Model):
    name = models.CharField(max_length=64, verbose_name='分类名称')
    first_category = models.ForeignKey(FirstCategory, related_name='sub_categories', verbose_name='上级分类')

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['name', ]
        verbose_name = '二级分类'
        verbose_name_plural = verbose_name


class GoodsInfo(models.Model):
    STATUS_CHOICES = (
        (1, '上架'),
        (2, '下架'),
    )

    title = models.CharField(max_length=100, verbose_name='标题')
    content = models.TextField(blank=True, null=True, verbose_name='正文')
    image = models.FileField(upload_to='images/goods/%Y/%m', blank=True, null=True, verbose_name='图片')
    status = models.IntegerField(choices=STATUS_CHOICES, default=1, verbose_name='状态')
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    publish_time = models.DateTimeField(blank=True, null=True, default=now, verbose_name='发布时间')
    updated_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    category = models.ForeignKey(SubCategory, on_delete=models.CASCADE, related_name='goods_info', verbose_name='所属分类')
    tags = models.ManyToManyField(GoodsTag, blank=True, verbose_name='标签集合')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '商品信息'
        verbose_name_plural = verbose_name

主路由

urlpatterns = [
    url(r'^test/', include('multiple_filter.urls', namespace='test')),
]

应用路由

访问 http://127.0.0.1:8000/test/goods.html 可跳转到 http://127.0.0.1:8000/test/goods-0-0-0-0.html

urlpatterns = [
    url(r'^goods.html$', goods, name='goods'),
    url(r'^goods-(?P<first_category_id>\d+)-(?P<sub_category_id>\d+)-(?P<tags_id>\d+)-(?P<status_id>\d+).html', goods, name='goods_filter'),
]

视图

from .models import GoodsTag, FirstCategory, SubCategory, GoodsInfo
from django.shortcuts import get_object_or_404


def goods(request, **kwargs):
    if not kwargs:
        return redirect('test:goods_filter', first_category_id='0', sub_category_id='0', tags_id='0', status_id='0')
    else:
        request_path = request.path
        print('\n当前请求路径:', request_path, '\n')
        print('kwargs:', kwargs)  # {'first_category_id': '0', 'sub_category_id': '0', 'tags_id': '0', 'status_id': '0'}

        goods_tag_list = GoodsTag.objects.all().values('id', 'name')
        first_category_list = FirstCategory.objects.all().values('id', 'name')
        sub_category_list = SubCategory.objects.all().values('id', 'name')
        status_list = list(map(lambda x: {'id': x[0], 'status': x[1]}, GoodsInfo.STATUS_CHOICES))
        filter_dict = dict()

        if kwargs['first_category_id'] == '0':
            # goods-0-x-x-x.html
            if kwargs['sub_category_id'] != '0':
                # goods-0-1-x-x.html
                sub_category = get_object_or_404(SubCategory, id=kwargs['sub_category_id'])
                # 选择二级分类后,由于多对一关系,一级分类也会跟着变化
                first_category_list = [{'id': sub_category.first_category.id, 'name': sub_category.first_category.name}]
                filter_dict['category'] = sub_category
        else:
            # 一级分类不为0,需要进行筛选
            # goods-1-x-x-x.html
            first_category = get_object_or_404(FirstCategory, id=kwargs['first_category_id'])
            sub_category_list = first_category.sub_categories.values('id', 'name')  # 选择一级分类后获取二级分类的列表
            if kwargs['sub_category_id'] != '0':
                sub_category = get_object_or_404(SubCategory, id=kwargs['sub_category_id'], first_category=first_category)
                # 选择二级分类后,由于多对一关系,一级分类也会跟着变化
                first_category_list = [{'id': sub_category.first_category.id, 'name': sub_category.first_category.name}]
                filter_dict['category'] = sub_category

        if kwargs['tags_id'] != '0':
            filter_dict['tags'] = kwargs['tags_id']

        if kwargs['status_id'] != '0':
            filter_dict['status'] = int(kwargs['status_id'])

        goods_list = GoodsInfo.objects.filter(**filter_dict)

        return render(request, 'goods.html',
                      {
                          'first_category_list': first_category_list,
                          'sub_category_list': sub_category_list,
                          'goods_tag_list': goods_tag_list,
                          'status_list': status_list,
                          'goods_list': goods_list
                      })

模板

<!DOCTYPE html>
{% load goods_active %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>多条件筛选</title>
</head>
<body>
{% active_all request.path 1 %}
{% for first_category in first_category_list %}
    {% active request.path first_category 1 %}
{% endfor %}
<br><br>
{% active_all request.path 2 %}
{% for sub_category in sub_category_list %}
    {% active request.path sub_category 2 %}
{% endfor %}
<br><br>
{% active_all request.path 3 %}
{% for goods_tag in goods_tag_list %}
    {% active request.path goods_tag 3 %}
{% endfor %}
<br><br>
{% active_all request.path 4 %}
{% for status in status_list %}
    {% active request.path status 4 %}
{% endfor %}
<p>
    {% for goods in goods_list %}
        <p>
            【{{ goods.title }}】{{ goods.content }}
        </p>
    {% endfor %}
</p>
</body>
</html>

链接生成模板标签

应用下创建templatetags包,创建 goods_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,进行值修改拼接
    :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">【全部】</a>
    """
    a_href_unactive = """
    <a href="{href}">全部</a>
    """
    url_part_list = current_url.split('-')
    if index == len(url_part_list)-1:  # 最后一个带.html要特殊处理
        if url_part_list[index] == '0.html':
            a_href = a_href_active
        else:
            a_href = a_href_unactive

        url_part_list[index] = '0.html'
    else:
        if url_part_list[index] == '0':
            a_href = a_href_active
        else:
            a_href = a_href_unactive

        url_part_list[index] = '0'

    href = '-'.join(url_part_list)
    a_href = a_href.format(href=href)
    return mark_safe(a_href)


@register.simple_tag
def active(current_url, item, index):