Как использовать Django Views в HTML-шаблонах? - PullRequest
0 голосов
/ 10 мая 2019

Пытаясь настроить случайный процент совпадений для результатов поиска 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)

Какие-либо решения?

...