аватар question@mail.ru · 01.01.1970 03:00

Django Solr(Filter) - Выпадающий список для объектов, как реализовать? либо адаптировать

Имеется такой список объектов, отображенных по значению атрибутов товаров.

Значения атрибутов товаров, которые связаны между собой - должны быть в форме выпадающего списка Select(option)/DropDownMenu, т.е. - к примеру вместо Size:Medium,Size:Small должно быть просто

MediumSmall

То что эти значения атрибутов относятся к 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:        retu [product_class for product_class in attributes]
аватар answer@mail.ru · 01.01.1970 03:00

Раз не кто не догадался как это реализовать - придется самому объяснять. Значения которые формируются в 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""))

И на этом все, я не учел тут проблем с уникодом(возникающих в строке заголовка), поскольку еще сам их решаю, да и вообще сам метод не совсем красивый, и возможно в самой форме потребуется чистка, поскольку если пользователь выбирает что-то другое то что было в форме остается, и в результате пользователь получает не совсем то что хотел, но пока у меня не было времени все доделать.

Если у кого то может есть вариант по лучше буду рад услышать ! а так , решил к сожалению сам !

Последние

Похожие