Pregunta

Tengo este código que estoy usando para generar una lista de registros categorizados por año, marca, serie, estilo de carrocería y color para vehículos. Me gustaría personalizar esto aún más de esta manera:

  • para el año, quiero que solo hasta 2004 sea individual ... el resto se incluirá en otro, es decir, 2009, 2008, 2007, 2006, 2005, 2004, Otro.
  • para la marca, quiero mostrar las seis marcas con la mayor popularidad ... hay un campo en el modelo que estoy usando para asignar la popularidad de una marca con un valor primario (más alto), secundario o terciario . El resto caerá en Otro.
  • Para el estilo y el color del cuerpo, quiero que los elementos que tengan menos de 3 registros se clasifiquen en Otros.

Mi código es el siguiente:

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'))
¿Fue útil?

Solución 2

Logré obtener una solución, así que pensé que sería bueno actualizar la respuesta aquí:

En la sección de encabezado tengo esto:

<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);

Entonces, donde quiera reducir la cantidad de opciones disponibles, tengo esto:

<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 %}

Otros consejos

La mayor parte de lo que está preguntando probablemente se manejará mejor fuera de Django y en su lugar mediante javascript del lado del cliente. Para ser claros, usted podría tener porciones manejadas por Django, pero sería más limpio no hacerlo. Hay beneficios de hacerlo de esta manera:

  1. El código de su plantilla Django se mantiene más limpio
  2. Se degradará muy bien
  3. Más tarde puede actualizar la interfaz (cambiar el javascript) y no tener que preocuparse por romper la plantilla de Django

Para manejar esto, simplemente puede hacer un script que cuando se le da una etiqueta <ul> (y tal vez algunos argumentos) representará esa lista en el formato que está preguntando.

Aquí hay un ejemplo simple usando jQuery. Para este ejemplo, voy a ajustar la funcionalidad usando un patrón de complemento jQuery.

Digamos que su plantilla de django genera lo siguiente ...

<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>

Este es un ejemplo bastante simple, y no cambiará el " Mostrar más " a " Ocultar más " pero deberías poder resolverlo a partir del contexto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top