Пытаясь настроить случайный процент совпадений для результатов поиска Django-Haystack, кажется, что на бэкенде все работает нормально (без ошибок), но я не могу отобразить эти совпадения в моих шаблонах (html).
Так как я могу их отобразить?
Вот мой код:
Использование пользовательских форм для стога сена в forms.py:
from haystack.forms import FacetedSearchForm
class FacetedProductSearchForm(FacetedSearchForm):
def __init__(self, *args, **kwargs):
data = dict(kwargs.get("data", []))
self.ptag = data.get('ptags', [])
super(FacetedProductSearchForm, self).__init__(*args, **kwargs)
def search(self):
sqs = super(FacetedProductSearchForm, self).search()
# Categories filter
if self.ptag:
query = None
for ptags in self.ptag:
if query:
query += u' OR '
else:
query = u''
query += u'"%s"' % sqs.query.clean(ptags)
sqs = sqs.narrow(u'ptags_exact:%s' % query)
return sqs
Тогда яЯ передаю его в пользовательский вид:
from .forms import FacetedProductSearchForm
from haystack.generic_views import FacetedSearchView as BaseFacetedSearchView
class FacetedSearchView(BaseFacetedSearchView):
form_class = FacetedProductSearchForm
facet_fields = ['ptags']
template_name = 'search_result.html'
paginate_by = 20
context_object_name = 'object_list'
И у меня есть две функции в моих представлениях для создания совпадающих баллов:
def random_search_match_percentages(array):
from random import random
from math import floor
index = 0
results = []
for element in array:
# define a maximum and a minimum range
maximum = 100 - index if index <= 100 else 0
minimum = maximum - 5 if maximum > 0 else 0
num = floor(random() * (maximum - minimum) + minimum + 0.5)
element.match = '{}%'.format(num) # add the match param
results.append(element)
# decrease the maximum and minimum for the next iteration
index += 5
return results
def MatchingScore(request):
some_data = Product.objects.all() # just an example of grabbing data...
paginator = Paginator(some_data, per_page=20) # Not sure if I need this..
page_obj = paginator.get_page(page) # And this..
results = random_search_match_percentages(page_obj)
return render(request, 'search_result.html', {'results': results})
Я пытаюсь передать эти баллыв мой шаблон search_result.html, но ни один из них не отображается:
<div>
{% if page_obj.object_list %}
<ol class="row top20" id="my_list">
{% for result in page_obj.object_list %}
<li class="list-item">
<div class="showcase col-sm-6 col-md-4">
<a href="{{ result.object.get_absolute_url }}">
<h3>{{result.object.title}}</h3>
<h5>{{ result.object.destination }}</h5>
<!-- Currently trying to pass the scores within the tag below -->
{% if results|length %}
{% for res in results %}
<p>{{ result.object.res.match }}</p>
{% endfor %}
{% endif %}
<img src="{{ result.object.image }}" class="img-responsive">
</a>
</div>
</li>
{% endfor %}
</ol>
{% else %}
<p> Sorry, no result found..</p>
{% endif %}
</div>
Мои URL:
from django.conf.urls import url
from django.contrib import admin
from search.views import HomeView, ProductView, FacetedSearchView, autocomplete
from .settings import MEDIA_ROOT, MEDIA_URL
from django.conf.urls.static import static
urlpatterns = [
url(r'^$', HomeView.as_view()),
url(r'^admin/', admin.site.urls),
url(r'^product/(?P<slug>[\w-]+)/$', ProductView.as_view(), name='product'),
url(r'^search/autocomplete/$', autocomplete),
url(r'^search/', FacetedSearchView.as_view(), name='haystack_search'),
] + static(MEDIA_URL, document_root=MEDIA_ROOT)
Какие-либо решения?