美文网首页
组合搜索速查_一对多

组合搜索速查_一对多

作者: 两点半的杂货铺 | 来源:发表于2018-03-02 22:38 被阅读10次

    一、页面展示

    image.png

    二、分析

    通过对url的分析,暂时我们可以归结出来搜索的思路,应用了url映射关系,分别对应数据库的查询,结果查询对应的两个条件都是一对多。

    • 构造数据库

    文章库分别和文本类型,以及部门表为一对多关系映射

    class Category(models.Model):
        caption = models.CharField(max_length=16)
    
    
    class ArticleType(models.Model):
        caption = models.CharField(max_length=16)
    
    class Article(models.Model):
        title = models.CharField(max_length=32)
        concent = models.CharField(max_length=225)
    
        category = models.ForeignKey(Category)
        article_type = models.ForeignKey(ArticleType)
    
    
    • 创建url

    url的思路是创建,一个url对应一组数据,这里要注意的是当我们在给url设置对应名称时,这里最好和数据库中的字段名对应

        url(r'^article/-(?P<article_type_id>\d+)-
              (?P<category_id>\d+)',views.article,name='article')
    
    
    • views 层的编写

    1.分别展示三个库的内容
    2.展示文本内容时,要注意用过滤条件的筛选
    3.当我们触发按钮时要保证,连接只改变我们点击的查询项,做图片说明

    image.png
    通过图片可以看出只改变前面的不改变后面的
    4.所以前后两个,是需要两个无关联参数才能做到
    5.我们一组关联是数据库,另外一组用连接返回的参数
    def article(request,**kwargs):也就是这里的kwargs
    def article(request,**kwargs):
        condition = {}
        # url = reverse('article',kwargs=kwargs)
        for k,v in kwargs.items():
            #我们要把链接的str转成int
            kwargs[k] = int(v)
            if v == "0":
                pass
            else:
                #字典的循环是每个键值对的循环
                condition[k] = v
        article_type_list = models.ArticleType.objects.all()
        category_list = models.Category.objects.all()
        resutl = models.Article.objects.filter(**condition)
        return  render(
            request,
            "article.html",
            {
                'result':resutl,
                'article_type_list':article_type_list,
                'category_list':category_list,
                'arg_dict':kwargs,
    
             }
        )
    
    • html

    1.连接用返回查询数据库的id值
    2.接收上一个连接的返回值

    <body>
    <h1>过滤条件</h1>
    <div class="condition">
        <div>
        {% if arg_dict.article_type_id == 0 %}
        <a  class="active" href="/article/-0-{{ arg_dict.category_id }}">全部</a>
        {% else%}
            <a  href="/article/-0-{{ arg_dict.category_id }}">全部</a>
        {% endif %}
            {% for i in article_type_list %}
                {% if i.id == arg_dict.article_type_id %}
                    <a class="active" href="/article/-{{ i.id }}-{{ arg_dict.category_id }}">{{ i.caption }}</a>
                {% else %}
                    <a  href="/article/-{{ i.id }}-{{ arg_dict.category_id }}">{{ i.caption }}</a>
                {% endif %}
            {% endfor %}
        </div>
        <div>
            {% if arg_dict.category_id == 0 %}
                <a class="active" href="/article/-{{ arg_dict.article_type_id }}-0">全部</a>
            {% else%}
                <a href="/article/-{{ arg_dict.article_type_id }}-0">全部</a>
            {% endif %}
            {% for i in category_list %}
                {% if i.id == arg_dict.category_id %}
                    <a class="active" href="/article/-{{ arg_dict.article_type_id }}-{{ i.id }}">{{ i.caption }}</a>
                {% else %}
                    <a  href="/article/-{{ arg_dict.article_type_id }}-{{ i.id }}">{{ i.caption }}</a>
                {% endif %}
            {% endfor %}
        </div>
    </div>
    <h1>插询结果</h1>
    <ul>
    {% for i in result %}
        <li>{{ forloop.counter }}{{ i.title }}</li>
    
    {% endfor %}
    </ul>
    </body>
    
    • 升级改造版

    1.用标签simple_tag:
    a.在app中创建templatetags文件
    b.创建任意.py文件
    要注意如果是一组连接使用数组,分装然后再拼接返回

    • html全部的写法
    from django.utils.safestring import mark_safe
    register = template.Library()
    
    @register.simple_tag
    def filter_all(arg_dict,k):
        '''
         {% if arg_dict.article_type_id == 0 %}
        <a  class="active" href="/article/-0-{{ arg_dict.category_id }}">全部</a>
        {% else%}
            <a  href="/article/-0-{{ arg_dict.category_id }}">全部</a>
        {% endif %}
    
        '''
        if k == "article_type_id":
            n1_k = arg_dict[k]
            n2_k = arg_dict['category_id']
            if n1_k == 0:
                ret = '<a  class="active" href="/article/-0-%s">全部</a>' % n2_k
            else:
                ret = '<a  href="/article/-0-%s">全部</a>' % n2_k
            return mark_safe(ret)
        else:
            n1_k = arg_dict[k]
            n2_k = arg_dict ['article_type_id']
            if n1_k == 0:
                ret = '<a  class="active" href="/article/-%s-0">全部</a>' % n2_k
            else:
                ret = '<a  href="/article/-%s-0">全部</a>' % n2_k
            return mark_safe(ret)
    
    • html 展示的写法
    @register.simple_tag
    def filter_article_type(article_type_list,arg_dict):
        '''
    
        {% for i in article_type_list %}
                {% if i.id == arg_dict.article_type_id %}
                    <a class="active" href="/article/-{{ i.id }}-{{ arg_dict.category_id }}">{{ i.caption }}</a>
                {% else %}
                    <a  href="/article/-{{ i.id }}-{{ arg_dict.category_id }}">{{ i.caption }}</a>
                {% endif %}
            {% endfor %}
        '''
        ret = []
        for i in article_type_list:
            if i.id == arg_dict['article_type_id']:
                temp = '<a class="active" href="/article/-%s-%s">%s</a>'%(i.id, arg_dict['category_id'],i.caption)
            else:
                temp = '<a href="/article/-%s-%s">%s</a>'%(i.id, arg_dict['category_id'],i.caption)
            ret.append(temp)
    
        #把列表转化成字符串
        print(" ".join(ret))
        return mark_safe(" ".join(ret))
    
    @register.simple_tag
    def filter_category(category_list,arg_dict):
        '''
          {% for i in category_list %}
                {% if i.id == arg_dict.category_id %}
                    <a class="active" href="/article/-{{ arg_dict.article_type_id }}-{{ i.id }}">{{ i.caption }}</a>
                {% else %}
                    <a  href="/article/-{{ arg_dict.article_type_id }}-{{ i.id }}">{{ i.caption }}</a>
                {% endif %}
            {% endfor %}
    
        '''
        ret = []
        for i in category_list:
            if i.id == arg_dict['category_id']:
                temp = '<a class="active" href="/article/-%s-%s">%s</a>' % ( arg_dict['article_type_id'],i.id, i.caption)
            else:
                temp = '<a href="/article/-%s-%s">%s</a>' % (arg_dict['article_type_id'],i.id, i.caption)
            ret.append(temp)
    
        # 把列表转化成字符串
        print(" ".join(ret))
        return mark_safe(" ".join(ret))
    
    • html
    <div class="condition">
        <div>
        {% filter_all arg_dict 'article_type_id' %}
        {% filter_article_type article_type_list arg_dict%}
        </div>
        <div>
            {% filter_all arg_dict 'category_id' %}
            {% filter_category category_list arg_dict %}
    
        </div>
    

    相关文章

      网友评论

          本文标题:组合搜索速查_一对多

          本文链接:https://www.haomeiwen.com/subject/tcxaxftx.html