Имеется такой список объектов, отображенных по значению атрибутов товаров.
Значения атрибутов товаров, которые связаны между собой — должны быть в форме выпадающего списка Select(option)/DropDownMenu, т.е. — к примеру вместо Size:Medium,Size:Small должно быть просто
Medium Small
То что эти значения атрибутов относятся к Size можно указать внутри Templates(label), т.е. это не так важно, главное — каким образом их можно поместить в этот Select список (Dropdown Menu).
От себя хочу добавить, что я пытался изменить значения которые указывается по умолчанию, в Templates, вместо CheckBox’ксов — я пробовал указать Select Option, но результат получился неправильным
TEMPLATES
Browse.html:
{% for field, data in facet_data.items %} {% if data.results %} {% include 'search/partials/facet.html' with name=data.name items=data.results %} {% endif %} {% endfor %}
facet.html:
{% for item in items %} <dd> <input class="facet_checkbox" type="checkbox" name="{{ item.name }}" /> <input class="facet_url" type="hidden" name="url_for_{{ item.name }}" value="{{ item.select_url }}" /> <a href="{{ item.select_url }}">{{ item.name }}</a> {% if item.show_count %} ({{ item.count }}) {% endif %} </dd>
Product Class
— это класс всех продуктов (товаров), используемый для индексирования, фильтром.
Далее идет просто уточнение тех значений, которые нужно отобразить (в моем случае это значения атрибутов)
Search_Indexes.py
class ProductIndex(indexes.SearchIndex, indexes.Indexable): product_class = indexes.MultiValueField(null=True, faceted=True) def prepare_product_class(self, obj): attributes = obj.attribute_values.all() if len(attributes) > 0: return [product_class for product_class in attributes]
Раз не кто не догадался как это реализовать — придется самому объяснять.
Значения которые формируются в HayStack и перерабатываются в template — не приспособлены к выпадающему списку как таковому, по этому эти значения нужно перенаправить в форму, а в форме уже описать логику, для этого надо:
1.Создать специальный {{tag}} который будет получать значения от словаря, и добавить его в Template, выглядеть это будет так —
{% load choice_tags %}
В самом тэге нужно указать форму.
@register.assignment_tag() def choice_form(request,field): form_class = addToChoiceForm
И еще 1 очень важный момент, если речь идет о Django(oscar), не знаю как у кого где описано, но в Oscar есть специальный ui.js, в которым описаны функции которые передают значения из поля, когда пользователь нажал на форму выбора, выглядит это так:
o.search.initFilterWidget(); initFilterWidget: function() { // Auto-submit (hidden) search form when selecting a new sort-by option $('#id_selected_facets').on('change', function() { $(this).closest('form').submit(); }); }
selected_facets
, это названия поля в вашей форме, далее в коде ее можно встретить.
Далее в Template следует передать значения от словаря.
{% for field, data in facet_data.items %} {% choice_form data field as choice_form %}
После чего следует указать форму Get, и поместить туда поле с формой, для передачи результата в адресную строку.
<form method="get" class="form-horizontal"> {% include "partials/form_fields.html" with form=choice_form %} </form>
Далее следует итрировать объекты полученные из словаря в choice_tags, и добавить их в массив(ну либо в словарь или вообще сразу передавать в форму).
Делается это как угодно я лично сделал так.
for dataResult in request['results']: items.append(dataResult)
Ну и передаем items,field в форму AddToChoiceForm
form = form_class(items,field)
Далее следует создать класс AddToChoiceForm Это стандартный класс не буду полностью описывать, обозначу лишь ключевые части которые нужно для формирования списка.
В начале Создаем массив Choices=[]
, в который мы будем передавать значения из словаря. Далее итрируем объекты. Обращаемся к интересующимся нас объектам по ключу, в моем примере это имя и путь url.
for item in items: select_url = item.get('select_url') Class_name = item.get('name')
И добавляем наши объекты в массив.
Тут 1 очень важный момент, чтобы избежать проблем с повторным кодированием в URL, Необходимо перекодировать все символы в простой вид для этого я использовал — родную библиотеку django purl
choices.append((unicode_unquote(select_url), Class_name))
Ну и добавляем наш массив в форму ChoiceField — выпадающий список.
self.fields['selected_facets'] = forms.ChoiceField( choices=choices,widget=forms.Select(), label=_("Variant"))
И на этом все, я не учел тут проблем с уникодом(возникающих в строке заголовка), поскольку еще сам их решаю, да и вообще сам метод не совсем красивый, и возможно в самой форме потребуется чистка, поскольку если пользователь выбирает что-то другое то что было в форме остается, и в результате пользователь получает не совсем то что хотел, но пока у меня не было времени все доделать.
Если у кого то может есть вариант по лучше буду рад услышать ! а так , решил к сожалению сам !