Domanda

Ho questo codice che sto usando per generare un elenco di record classificati in anno, marca, serie, stile della carrozzeria e colore dei veicoli. Vorrei personalizzare ulteriormente in questo modo:

  • per l'anno, voglio avere solo fino al 2004 come individuo ... il resto cadrà sotto altri, cioè 2009, 2008, 2007, 2006, 2005, 2004, Altro.
  • per la marca, voglio visualizzare le sei marche con la massima popolarità ... c'è un campo nel modello che sto usando per assegnare la popolarità di una marca con un valore primario (più alto), secondario o terziario . Il resto cadrà sotto Altro.
  • Per lo stile del corpo e il colore, voglio che gli articoli con meno di 3 record rientrino in Altro.

Il mio codice è il seguente:

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'))
È stato utile?

Soluzione 2

Sono riuscito a ottenere una soluzione, quindi ho pensato che sarebbe stato utile aggiornare la risposta qui:

Nella sezione head ho questo:

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

Quindi, ovunque io voglia ridurre il numero di opzioni disponibili, ho questo:

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

Altri suggerimenti

La maggior parte di ciò che stai chiedendo sarebbe probabilmente meglio gestita al di fuori di Django e invece tramite javascript sul lato client. Per essere chiari, potresti avere porzioni gestite da Django, ma sarebbe più pulito non farlo. Ci sono dei vantaggi nel farlo in questo modo:

  1. Il tuo codice modello Django rimane più pulito
  2. Si degraderà bene
  3. Successivamente puoi aggiornare l'interfaccia (cambiare il javascript) e non devi preoccuparti di rompere il modello di Django

Per gestirlo puoi semplicemente creare uno script che, quando viene dato un tag <ul> (e forse alcuni argomenti), renderà quell'elenco nel formato che stai chiedendo.

Ecco un semplice esempio usando jQuery. Per questo esempio, ho intenzione di racchiudere la funzionalità in un modello di plugin usando jQuery.

Supponi che il tuo modello django produca il seguente ...

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

Questo è un esempio piuttosto semplice e non cambierà il " Mostra di più " a " Nascondi di più " ma dovresti essere in grado di capirlo dal contesto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top