Как совместить форму поиска и фильтр django вместе? - PullRequest
0 голосов
/ 21 марта 2019

Прежде всего, я использовал django_filters, который имеет следующий код:

from .models import Product
import django_filters

class ProductFilter(django_filters.FilterSet):
    product_name = django_filters.CharFilter(lookup_expr='icontains', label='Product Name')
    product_price = django_filters.NumberFilter()
    product_price__gt = django_filters.NumberFilter(field_name='product_price', lookup_expr='gt', label='Min Price')
    product_price__lt = django_filters.NumberFilter(field_name='product_price', lookup_expr='lt', label='Max price')
    hotel_location = django_filters.CharFilter(lookup_expr='icontains', label='hotel location')



    class Meta:
        model = Product
         fields = ['product_name', 'product_price', 'vendor_name', 'hotel_location']

Код шаблона для вышеуказанного фильтра:

    <table id="myTable">
    <thead>
      <tr>
        <th>Image</th>
        ......
      </tr>
    </thead>
    <tbody >

      {% for lap in filter.qs|slice:":20"  %}
        <tr >
          <td class="col-sm-3">
              <div >
                    <div class="product-image-wrapper">
                        <div class="single-products">
                            <div class="productinfo text-center">
                                <img src="{{ lap.product_image }}" alt=""  />
                            </div>
                        </div>
                    </div>
             </div>
          </td>
          .......


        </tr>
        .......
      {% endfor %}
    </tbody>
  </table>

Файл views.pyследующий код для него:

def searchTable(request):
    product_list = Product.objects.all()
    product_filter = ProductFilter(request.GET, queryset=product_list)
    return render(request, 'searchTable.html', {'filter': product_filter})

Но у меня есть другая форма поиска, которая находится в базовом шаблоне.Код для этого:

<form class="navbar-form" method="post" action="{% url 'searchTable' %}" ">
                            {% csrf_token %}

<input type="text" name="srh" class="form-control" placeholder="Search To Compare Products">

    <button class="btn btn-secondary" type="submit"></button>

    </div>
</form>

Файл views.py имеет следующий код для этого:

def tablesorter(request):
    if request.method == 'POST':
        srch = request.POST['srh']

        if srch:
            match = Product.objects.filter(Q(product_name__icontains=srch)
                                           | Q(vendor_name__icontains=srch)
                                           | Q(hotel_location__icontains=srch))
            if match:
                return render(request, 'searchTable.html', {'sr':match})
            else:
                messages.error(request, 'No result found')

        else:
            return HttpResponseRedirect('tablesorter')
    return render(request, 'searchTable.html')

Теперь мой вопрос: я хочу показать результаты поиска для моего представления фильтраи поиск формы просмотра.Каким будет код этого цикла, чтобы он работал для обоих:

{% for lap in filter.qs|slice:":20"  %}
        <tr >
          <td class="col-sm-3">
              <div >
                    <div class="product-image-wrapper">
                        <div class="single-products">
                            <div class="productinfo text-center">
                                <img src="{{ lap.product_image }}" alt=""  />
                            </div>
                        </div>
                    </div>
             </div>
          </td>
          .......


        </tr>
        .......
      {% endfor %}

Каким-то образом мне нужно передать переменную sr в вышеуказанном цикле.Но как?Пожалуйста, помогите ...

...