zoukankan      html  css  js  c++  java
  • 组合搜索

    1:n的情况

    1. 模型:视频、分类、级别

    2. 关系:视频(n):分类(1)、视频(n):级别(1)

    3. 新建一个项目 mysite

    4. 新建一个应用 app01

    5. 在mysite项目下新建一个文件夹 static

    6. 在mysite项目下新建一个文件夹 templates (备注:如果使用IDE创建项目,则该文件夹会自动生成)

    7. 在app01应用下新建一个文件夹 templatetags

    8. 在models.py中新增模型类

    from django.db import models
    
    
    class Level(models.Model):
        """级别表"""
        name = models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    
    
    class Category(models.Model):
        """分类表"""
        name = models.CharField(max_length=32)
        def __str__(self):
            return self.name
    
    class Video(models.Model):
        """视频表"""
        lv = models.ForeignKey(Level)
        cg = models.ForeignKey(Category)
    
        title = models.CharField(verbose_name='标题', max_length=32)
        summary = models.CharField(verbose_name='简介', max_length=32)
        img = models.ImageField(verbose_name='图片', upload_to='./static/images/Video/')
        href = models.CharField(verbose_name='视频地址', max_length=256)
    
        create_date = models.DateTimeField(auto_now_add=True)
    
        def __str__(self):
            return self.title
    

    9. 在admin.py中注册模型类

    from django.contrib import admin
    from app01 import models
    
    admin.site.register(models.Level)
    admin.site.register(models.Category)
    admin.site.register(models.Video)
    

    10. 修改mysite应用下的settings.py文件

    """ 第1步 添加应用"""
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
    ]
    
    """ 第2步 配置静态文件路径"""
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR,'static'),
    )
    

    11. 在mysite项目下的urls.py文件中新增路由

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^video1-(?P<cg_id>d+)-(?P<lv_id>d+).html', views.video1,name='vvv'),
    ]
    

    12. 在templates文件夹下新建一个video.html文件

    {% load xx %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .filter a{
                display: inline-block;
                margin: 5px;
                padding: 3px 5px;
            }
            .filter a.active{
                background-color: brown;
                color: white;
            }
        </style>
    </head>
    <body>
        <h1>筛选条件</h1>
        <div class="filter">
            <div>
                {% total_tag arg_dict "cg_id" %}
                {% for item in category_list %}
                    {% category_tag item arg_dict %}
                {% endfor %}
            </div>
            <div>
                {% total_tag arg_dict "lv_id" %}
                {% for item in level_list %}
                    {% level_tag item arg_dict %}
                {% endfor %}
            </div>
        </div>
    
        <h1>查询结果</h1>
        <div class="content">
            {% for row in result %}
                <div style=" 100px;height: 260px;float: left;">
                    <img style=" 100px;height: 150px;" src="{{ row.img }}">
                    <p>{{ row.title }}</p>
                    <p>{{ row.summary }}</p>
                </div>
            {% endfor %}
        </div>
    
    </body>
    </html>
    

    13. 在app01应用下的views.py文件中新增视图函数video1

    from django.shortcuts import render, HttpResponse
    from app01 import models
    
    
    def video1(request, *args, **kwargs):
        """ 通过别名vvv反向生成url
            from django.urls import reverse
            url = reverse('vvv', kwargs={'cg_id': 1, 'lv_id': 2})
            print(url)
        """
        condition = {}
        for k, v in kwargs.items():
            if v == '0':
                pass
            else:
                condition[k] = v
        category_list = models.Category.objects.all()   # 获取所有分类
        level_list = models.Level.objects.all()    # 获取所有级别
    
        result = models.Video.objects.filter(**condition)
        return render(request,
                      'video1.html', {
                          'category_list': category_list,
                          'level_list': level_list,
                          'result': result,
                          'arg_dict': kwargs
                      })
    

    14. 在templatetags文件夹下新建xx.py

    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library()
    
    
    @register.simple_tag
    def category_tag(obj,arg_dict):
        """ 生成分类的a标签 """
        # 通过别名vvv反向生成url
        from django.urls import reverse
        url = reverse('vvv', kwargs={'cg_id': obj.id, 'lv_id': arg_dict.get('lv_id')})
    
        if str(obj.id) == arg_dict.get('cg_id'):
            # 获取当前URL
            tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
            return mark_safe(tag)
        else:
            tag = "<a href='%s'>%s</a>" % (url, obj.name)
            return mark_safe(tag)
    
    @register.simple_tag
    def level_tag(obj,arg_dict):
       """ 生成级别的a标签 """
    
        from django.urls import reverse
        url = reverse('vvv', kwargs={'cg_id': arg_dict.get('cg_id'), 'lv_id': obj.id})
    
        if str(obj.id) == arg_dict.get('lv_id'):
            tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
            return mark_safe(tag)
        else:
            tag = "<a href='%s'>%s</a>" % (url, obj.name)
            return mark_safe(tag)
    
    @register.simple_tag
    def total_tag(arg_dict,key):
       """ 生成全部的a标签 """
    
        from django.urls import reverse
        if key == 'cg_id':
            url = reverse('vvv', kwargs={'cg_id': 0, 'lv_id': arg_dict.get('lv_id')})
        elif key == 'lv_id':
            url = reverse('vvv', kwargs={'cg_id': arg_dict.get('cg_id'), 'lv_id': 0})
        else:
            url = ""
    
        tag = "<a href='%s'>全部</a>" % (url,)
        return mark_safe(tag)
    

    备注:自定义tagde使用


    n:n的情况

    1. 模型:视频、分类、级别、方向

    2. 关系:方向(n):分类(n)

    3. 新建一个项目 mysite

    4. 新建一个应用 app01

    5. 在mysite项目下新建一个文件夹 static

    6. 在mysite项目下新建一个文件夹 templates (备注:如果使用IDE创建项目,则该文件夹会自动生成)

    7. 在app01应用下新建一个文件夹 templatetags

    8. 在models.py中新增模型类

    from django.db import models
    
    
    class Level(models.Model):
        """ 级别表 """
        name = models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    
    class Direction(models.Model):
        """ 反向表表 """
        name = models.CharField(max_length=32)
        d_2_c = models.ManyToManyField('Category')
    
    class Category(models.Model):
        """ 分类表 """
        name = models.CharField(max_length=32)
        def __str__(self):
            return self.name
    
    class Video(models.Model):
        """ 视频表 """
        lv = models.ForeignKey(Level)
        cg = models.ForeignKey(Category)
    
        title = models.CharField(verbose_name='标题', max_length=32)
        summary = models.CharField(verbose_name='简介', max_length=32)
        img = models.ImageField(verbose_name='图片', upload_to='./static/images/Video/')
        href = models.CharField(verbose_name='视频地址', max_length=256)
    
        create_date = models.DateTimeField(auto_now_add=True)
        def __str__(self):
            return self.title 

    9. 在admin.py中注册模型类

    from django.contrib import admin
    from app01 import models
    
    admin.site.register(models.Level)
    admin.site.register(models.Category)
    admin.site.register(models.Video)
    admin.site.register(models.Direction)

    10. 修改mysite应用下的settings.py文件

    """第1步 添加应用"""
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
    ]
    
    """第2步 添加静态文件路径"""
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR,'static'),
    )

    11. 在mysite项目下的urls.py文件中新增路由

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^video2-(?P<dr_id>d+)-(?P<cg_id>d+)-(?P<lv_id>d+).html', views.video2,name='vvv2'),
    ]

    12. 在templates文件夹下新建一个video2.html文件

    {% load xx %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .filter a{
                display: inline-block;
                margin: 5px;
                padding: 3px 5px;
            }
            .filter a.active{
                background-color: brown;
                color: white;
            }
        </style>
    </head>
    <body>
        <h1>筛选条件</h1>
        <div class="filter">
            <div>
                {% total_tag_2 arg_dict 'dr_id' %}
                {% for item in drection_list %}
                    <!-- if判断,如果kwargs.dr_id = item.id
                        - 加入样式
                    else:
                        - 无样式
                       -->
                    {% dr_tag item arg_dict %}
                {% endfor %}
    
            </div>
            <div>
                {% total_tag_2 arg_dict 'cg_id' %}
                {% for item in category_list %}
                    {% cg_tag item arg_dict %}
                {% endfor %}
            </div>
            <div>
                {% total_tag_2 arg_dict 'lv_id' %}
                {% for item in level_list %}
                    {% lv_tag item arg_dict %}
                {% endfor %}
            </div>
        </div>
    
        <h1>查询结果</h1>
        <div class="content">
            {% for row in result %}
                <div style=" 100px;height: 260px;float: left;">
                    <img style=" 100px;height: 150px;" src="{{ row.img }}">
                    <p>{{ row.title }}</p>
                    <p>{{ row.summary }}</p>
                </div>
            {% endfor %}
        </div>
    
    </body>
    </html>

    13. 在app01应用下的views.py文件中新增视图函数video2

    from django.shortcuts import render, HttpResponse
    from app01 import models
    
    
    def video2(request, *args, **kwargs):
        # 0-0-0.html
        # 0-1-0.html
        # 1-0-0.html
        # 1-1-0.html [1,2,3,4]
        # 2-1-0.html [2,3,4]
    dr_id = kwargs.get('dr_id') cg_id = kwargs.get('cg_id') lv_id = kwargs.get('lv_id') condition = {} drection_list = models.Direction.objects.all() level_list = models.Level.objects.all() if dr_id == "0": # 未选择方向 category_list = models.Category.objects.all() if cg_id == '0': # 未选择分类 pass else: # 选择分类 # models.Video.objects.filter(cg_id=cg_id) condition['cg_id'] = cg_id else: # 选择了方向 category_list = models.Category.objects.filter(direction=dr_id) temp = category_list.values_list('id') cg_id_list = list(zip(*temp))[0] if cg_id == '0': # 未选择分类 condition['cg_id__in'] = cg_id_list else: # 选择了分类 if int(cg_id) in cg_id_list: condition['cg_id'] = cg_id else: condition['cg_id__in'] = cg_id_list kwargs['cg_id'] = '0' if lv_id == '0': pass else: condition['lv_id'] = lv_id result = models.Video.objects.filter(**condition) print(result) return render(request, 'video2.html', { 'drection_list': drection_list, 'level_list': level_list, 'category_list': category_list, 'arg_dict':kwargs })

    14. 在templatetags文件夹下新建xx.py

    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library()
    
    @register.simple_tag
    def dr_tag(obj,arg_dict):
        """ 生成方向的a标签 """
    
        from django.urls import reverse
        url = reverse('vvv2', kwargs={'dr_id': obj.id, 'cg_id': arg_dict.get('cg_id'), 'lv_id': arg_dict.get('lv_id')})
    
        if str(obj.id) == arg_dict.get('dr_id'):
            # 获取当前URL
            tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
            return mark_safe(tag)
        else:
            tag = "<a href='%s'>%s</a>" % (url, obj.name)
            return mark_safe(tag)
    
    
    @register.simple_tag
    def cg_tag(obj,arg_dict):
        """ 生成分类的a标签 """
    
        from django.urls import reverse
        url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': obj.id, 'lv_id': arg_dict.get('lv_id')})
    
        if str(obj.id) == arg_dict.get('cg_id'):
            # 获取当前URL
            tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
            return mark_safe(tag)
        else:
            tag = "<a href='%s'>%s</a>" % (url, obj.name)
            return mark_safe(tag)
    
    
    
    @register.simple_tag
    def lv_tag(obj,arg_dict):
        """ 生成级别的a标签 """
    
        from django.urls import reverse
        url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': arg_dict.get('cg_id'), 'lv_id': obj.id})
    
        if str(obj.id) == arg_dict.get('lv_id'):
            # 获取当前URL
            tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name)
            return mark_safe(tag)
        else:
            tag = "<a href='%s'>%s</a>" % (url, obj.name)
            return mark_safe(tag)
    
    
    @register.simple_tag
    def total_tag_2(arg_dict,key):
        """ 生成全部的a标签 """
        from django.urls import reverse
        if key == 'dr_id':
            url = reverse('vvv2', kwargs={'dr_id': 0, 'cg_id': arg_dict.get('cg_id'), 'lv_id': arg_dict.get('lv_id')})
        elif key == 'cg_id':
            url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': 0, 'lv_id': arg_dict.get('lv_id')})
    
        elif key == 'lv_id':
            url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': arg_dict.get('cg_id'), 'lv_id': 0})
        else:
            url = ''
        if arg_dict.get(key) == '0':
            tag = "<a class='active' href='%s'>全部</a>" % (url,)
        else:
            tag = "<a href='%s'>全部</a>" % (url,)
        return mark_safe(tag)
  • 相关阅读:
    centos 7.3 配置vnc 服务 图形界面登录
    安装vnc出现的问题
    HDFS文件系统的JAVA-API操作(一)
    kafka offset的存储问题
    kafka查询topic属性含义
    java静态类、静态方法、静态代码块,静态变量及实例方法,实例变量初始化顺序及内存管理,机制
    avg函数忽略null值
    为服务开启BBR加速
    正则表达式转义所有特殊符号
    Scala 运算符优先顺序
  • 原文地址:https://www.cnblogs.com/yzls/p/9466307.html
Copyright © 2011-2022 走看看