Frage

Ich habe diesen Code verwende ich eine Liste der Datensätze in Jahr kategorisiert zu erzeugen, machen, Serie, Body Art und Farbe für Fahrzeuge. Ich möchte diese weiter auf diese Weise anpassen:

  • für das Jahr, ich will bis zum Jahr 2004 nur haben, wobei einzelne ... der Rest unter anderen fällt das heißt 2009, 2008, 2007, 2006, 2005, 2004, Andere.
  • für den make, ich möchte mit der höchsten Popularität der sechs Marken anzuzeigen ... gibt es ein Feld in dem Modell verwende ich die Popularität einer Marke mit einem Wert von primären (höchste), sekundären oder tertiären zuweisen . Der Rest wird unter Andere fallen.
  • Für den Körper Art und Farbe, möchte ich die Einzelteile haben, die weniger als 3 Datensätze unter Andere fallen.

Mein Code ist wie folgt:

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'))
War es hilfreich?

Lösung 2

Ich schaffte es, eine Lösung zu bekommen, so dass ich dachte, es sei gut, um die Antwort zu aktualisieren, hier:

Im Kopfteil Ich habe diese:

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

Dann, wo ich die Anzahl der verfügbaren Optionen reduzieren möchte ich dies:

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

Andere Tipps

Der größte Teil von dem, was Sie fragen, wäre wahrscheinlich besser außerhalb von Django behandelt werden und stattdessen durch clientseitige JavaScript. Um es klar, Sie könnte haben Teile von Django behandelt, aber es wäre sauberer nicht zu tun. Es gibt Vorteile, um es auf diese Weise tun:

  1. Ihre Django Template-Code bleibt sauber
  2. Es wird degradieren schön
  3. Sie können später die Schnittstelle aktualisieren (die JavaScript ändern) und keine Sorgen um die Django-Vorlage über brechen

Um dies zu umgehen können Sie einfach ein Skript, dass ein <ul> Tag, wenn gegeben (und vielleicht noch einige Argumente) wird diese Liste im Format macht über Sie fragen.

Hier ist ein einfaches Beispiel mit jQuery. Für dieses Beispiel werde ich die Funktionalität in einem mit einem jQuery-Plugin Mustern wickeln.

Sagen Sie Ihre django-Vorlage gibt die folgende ...

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

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

Dies ist ein ziemlich einfaches Beispiel, und es wird die „mehr“ zu „Hide Mehr“ nicht wechseln, aber Sie sollen, dass aus dem Kontext Abbildung der Lage sein, aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top