自定义计数列表

时间:2009-11-30 06:29:08

标签: django django-queryset

我有这个代码,我用来生成分类为车辆的年份,品牌,系列,车身风格和颜色的记录列表。我想以这种方式进一步定制:

  • 这一年,我希望2004年只有个人......其余的将属于其他方面,即2009年,2008年,2007年,2006年,2005年,2004年,其他。
  • 对于制作,我想显示具有最高人气的六个品牌......模型中有一个字段我用来指定一个品牌的受欢迎程度,其值为初级(最高),二级或三级。其余的将属于其他。
  • 对于正文样式和颜色,我希望少于3条记录的项目属于其他。

我的代码如下:

year_count = vehicle_query.order_by(
  '-common_vehicle__year__year').values('common_vehicle__year__year').
  annotate(count=Count('id'))
make_count = vehicle_query.order_by(
  'common_vehicle__series__model__manufacturer__manufacturer').
  values('common_vehicle__series__model__manufacturer__manufacturer').
  annotate(count=Count('id'))
style_count = vehicle_query.order_by(
  'common_vehicle__body_style__style').values
  ('common_vehicle__body_style__style').annotate(count=Count('id'))
colour_count = vehicle_query.order_by(
  'exterior_colour__exterior_colour').values(
  'exterior_colour__exterior_colour').annotate(count=Count('id'))

2 个答案:

答案 0 :(得分:0)

你要问的大部分内容可能最好在Django之外处理,而不是客户端javascript。要清楚,你可能有部分由Django处理,但如果不这样做会更干净。这样做有好处:

  1. 您的Django模板代码保持清洁
  2. 它会很好地降级
  3. 您可以稍后更新界面(更改javascript),而不必担心破坏Django模板
  4. 要处理这个问题,您可以简单地创建一个脚本,当给定<ul>标记(可能还有一些参数)时,会以您要询问的格式呈现该列表。

    这是一个使用jQuery的简单示例。对于这个例子,我将使用jQuery插件模式包装功能。

    假设您的django模板输出以下内容......

    <ul>
        <li>Chevy</li>
        <li>Mazda</li>
        <li>Honda</li>
        <li>Ford</li>
        <li>BMW</li>
    </ul>
    

    <强> jquery.showmorelist.js

    (function($) {
    
        $.fn.ShowMoreList = function(visibleItemCount) {
    
            // Wrap parent element
            var parent = $(this).wrap('<div class="show-more-list"></div>').parent();
            var ul = $(this);
    
            // Enumerate children and hide extras
            var counter = 0;
            $(this).children().filter('li').each(function(){
                counter += 1;
                if (counter > visibleItemCount) {
                    $(this).hide();
                    $(this).addClass('hidden');
                }
            });
    
            // Add link and bind click
            var link = $('<a href="#">&gt; Show More</a>').click(function(){
               $(ul).children().filter('.hidden').show();
            });
            $(parent).append(link);
        }
    
    })(jQuery);
    

    <强> page.html中

    <script type="text/javascript" src="jquery.showmorelist.js"></script>
    <script type="text/javascript">
        // On page load...
        $(function() {
                $('ul').ShowMoreList(4);    // Shows only the first 4 items
        });
    </script>
    

    这是一个相当简单的示例,它不会将“显示更多”切换为“隐藏更多”,但您应该能够从上下文中找出答案。

答案 1 :(得分:0)

我设法得到了一个解决方案,所以我觉得在这里更新答案会很好:

在头部我有这个:

<script type="text/javascript" src="{{ MEDIA_URL }}share/jquery/jquery.min.js"></SCRIPT>
<script type="text/javascript">
(function($) {
$(document).ready(function() {
    //hide the additional content under "Display More"
    $("div.additional_content").hide();

    $("a.more").click(function () { 
        //show or hide the additional content
        $(this).siblings("div.additional_content").toggle();
        //change the attributes and text value of the link toggle
        if($(this).text() == "Display Less"){
            $(this).removeClass("less");
            $(this).addClass("more");
            $(this).html("Display More");
        }else{
            $(this).removeClass("more");
            $(this).addClass("less");
            $(this).html("Display Less");
        }
        return false;
    });             
});
})(jQuery);

然后,无论我想减少可用选项的数量,我都有:

<div class="module_wrap">
  <div class="module"> {% if year_count %} <strong>{% trans "Year" %}</strong> <br />
    {% for item in year_count|slice:":6" %}
    <ul>
      <li> <a href="/inventory/year/{{ item.common_vehicle__year__year }}/">{{ item.common_vehicle__year__year }} ({{ item.count }})</a> {% if request.session.chosen_year %} <a href="/undo_year/"><img src="{{ MEDIA_URL }}img/undo.gif" border="0" alt="Remove Year Filter" title="Remove Year Filter" /></a> {% endif %} </li>
    </ul>
    {% endfor %}
    <div class="additional_content"> {% for item in year_count|slice:"6:" %}
      <ul>
        <li> <a href="/inventory/year/{{ item.common_vehicle__year__year }}/">{{ item.common_vehicle__year__year }} ({{ item.count }})</a></li>
      </ul>
      {% endfor %} </div>
    {% if year_count|slice:"6:" %}<a href="" class="more">Display More</a><br />
    {% endif %} <br />
  </div>
</div>
{% endif %}