Настройка списка подсчетов
-
10-07-2019 - |
Вопрос
У меня есть этот код, который я использую для создания списка записей, классифицированных по годам выпуска, марке, серии, стилю кузова и цвету для транспортных средств.Я бы хотел еще больше настроить это таким образом:
- в течение года я хочу, чтобы только до 2004 года было индивидуальным ... остальное подпадет под другие, т.е.2009, 2008, 2007, 2006, 2005, 2004, Другое.
- для марки я хочу отобразить шесть марок с наибольшей популярностью ... в модели, которую я использую, есть поле для присвоения популярности марки со значением primary (наивысший), secondary или третичный.Остальное подпадет под Другие.
- Что касается стиля и цвета корпуса, я хочу, чтобы элементы, имеющие менее 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
Мне удалось найти решение, поэтому я подумал, что было бы неплохо обновить ответ здесь:
В разделе head у меня есть это:
<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 %}
Другие советы
Основную часть того, что вы просите, вероятно, лучше было бы обрабатывать вне Django, а вместо этого с помощью клиентского javascript.Чтобы было ясно, вы мог бы пусть части обрабатываются Django, но было бы чище этого не делать.В том, чтобы делать это таким образом, есть свои преимущества:
- Ваш код шаблона Django остается более чистым
- Это будет приятно ухудшаться
- Позже вы можете обновить интерфейс (изменить javascript) и не беспокоиться о взломе шаблона Django
Чтобы справиться с этим, вы могли бы просто создать скрипт, который при задании <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="#">> 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>
Это довольно простой пример, и он не переключит "Показать больше" на "Скрыть больше", но вы должны быть в состоянии понять это из контекста.