Ошибка типа в / search / search () отсутствует 1 обязательный позиционный аргумент: 'запрос' - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь добавить поисковые фильтры для моих django-taggit тегов в моем проекте Django, но я продолжаю получать TypeError.

Я использую Django-Haystack и Elasticsearch для функций поиска, и на этот раз я пытаюсь добавить фильтр с фасетами haystack.

Полный вывод:

Internal Server Error: /search/
Traceback (most recent call last):
  File "C:\Users\loicq\desktop\coding\uvergo_search\venv\lib\site-packages\django\core\handlers\exception.py", line 39, in inner
    response = get_response(request)
  File "C:\Users\loicq\desktop\coding\uvergo_search\venv\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\loicq\desktop\coding\uvergo_search\venv\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\loicq\desktop\coding\uvergo_search\venv\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\loicq\desktop\coding\uvergo_search\venv\lib\site-packages\django\views\generic\base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\loicq\desktop\coding\uvergo_search\venv\lib\site-packages\haystack\generic_views.py", line 123, in get
    return self.form_valid(form)
  File "C:\Users\loicq\desktop\coding\uvergo_search\venv\lib\site-packages\haystack\generic_views.py", line 76, in form_valid
    self.queryset = form.search()
TypeError: search() missing 1 required positional argument: 'request'
[02/May/2019 15:29:31] "GET /search/?q=las+vegas&Ptags=Solo HTTP/1.1" 500 82872

Мои модели:

class Product(models.Model):
    title = models.CharField(max_length=255, default='')
    slug = models.SlugField(null=True, blank=True, unique=True, max_length=255, default='')
    description = models.TextField(default='')

    ptags = TaggableManager()

    image = models.ImageField(default='')
    timestamp = models.DateTimeField(auto_now=True)

    def _ptags(self):
        return [t.name for t in self.ptags.all()]

    def get_absolute_url(self):
        return reverse('product',
                       kwargs={'slug': self.slug})


    def __str__(self):
        return self.title

Мой заказ forms.py:

from haystack.forms import FacetedSearchForm
from django.db.models.query import QuerySet


class FacetedProductSearchForm(FacetedSearchForm):

    def __init__(self, *args, **kwargs):
        data = dict(kwargs.get("data", []))
        super(FacetedProductSearchForm, self).__init__(*args, **kwargs)

    def search(self, request):
        sqs = super(FacetedProductSearchForm, self).search()

        ptags = request.query_params.get('ptags', None)

        if ptags:
            ptags = ptags.split(',')
            sqs = queryset.filter(ptags__name__in=ptags).distinct()

        return sqs

И я передаю функцию от forms.py следующим представлениям:

class FacetedSearchView(BaseFacetedSearchView):

    form_class = FacetedProductSearchForm
    facet_fields = ['ptags']
    template_name = 'search_result.html'
    paginate_by = 6
    context_object_name = 'object_list'
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)

1 Ответ

0 голосов
/ 02 мая 2019

Вы добавили параметр request в метод search, но Хейстек не ожидает этот параметр и не знает, как его передать.

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

class FacetedSearchView(BaseFacetedSearchView):
    ..
    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs["request"] = self.request
        return kwargs

class FacetedProductSearchForm(FacetedSearchForm):
    def __init__(self, *args, **kwargs):
        self request = kwargs.pop("request", None)
        ...

    def search(self):
        ...
        ptags = self.request.GET.get('ptags', None)
...