2014-11-27 3 views
0

Я создаю приложение Django и пытаюсь включить больше полей поиска в интерфейс администратора Django для конкретной модели, чтобы пользователи могли одновременно искать больше полей. Например, пользователи могут вводить в одном поле поиска название города, а в другом поле поиска - название улицы, а все экземпляры модели, имеющие соответствующие города и улицы, отображаются в браузере после нажатия кнопки «Поиск». Веб-интерфейс администратора по умолчанию имеет только одно окно поиска. Я добавил три окна поиска в файл change_list.html, и когда я ввожу некоторые данные в эти поля поиска в браузере и нажимаю «Поиск», формируется правильный URL-адрес (с строкой запроса, содержащей эти три входных параметра, по которым нужно выполнить поиск). Затем я фиксирую эти входные параметры в методе queryset, который я переопределил в своем классе, который расширяет циклы models.AdminModel, выполняет фильтрацию набора запросов и, наконец, возвращает отфильтрованный запрос. Теперь проблема заключается в том, что набор фильтрованных запросов просто не отображается на веб-странице (веб-интерфейс моей модели) после того, как процесс поиска завершен, он говорит, что совпадений не найдено. Но я определенно уверен, что набор фильтрованных запросов содержит данные, которые я печатаю в командной строке перед выполнением команды return метода queryset, и он печатает правильные данные.Queryset не отображается в интерфейсе администратора django

Вот мой queryset метод:

def queryset(self, request): 

    qs = super(UkopcanjeAdmin, self).queryset(request) 
    if "mjesto" in request.GET: 
     lokacija = request.GET.get('mjesto',None) 
     if lokacija: 
      qs = qs.filter(mjesto__icontains=lokacija) 

    if "ulica" in request.GET: 
     ulica = request.GET.get('ulica',None) 
     if ulica: 
      qs = qs.filter(ulica__icontains=ulica) 

    if "naziv" in request.GET: 
     naziv = request.GET.get('naziv',None) 
     if naziv: 
      qs = qs.filter(naziv__icontains=naziv) 

    print qs #this prints correct filtered data 
    return qs 

Почему не отфильтрованный набор запросов показан в веб-интерфейсе?

EDIT: Благодаря моему другу, мне наконец-то удалось решить проблему. И решение довольно простое, все, что мне нужно было сделать, - переместить весь код метода queryset в метод get_search_results, а по отфильтрованному запросу query return false boolean parameter (потому что метод get_search_results возвращает два параметра). Поэтому, если кто-то хочет настроить процесс поиска в Django, следует использовать метод get_search_results. Там вы можете получить доступ к аргументам строки запроса и получить некоторые данные так, как вы хотите.

ответ

1

Думаю, что это должно быть get_queryset, но не queryset метод.

def get_queryset(request): 
    #your code here 
    queryset = super(UkopcanjeAdmin, self).get_queryset(request) 
    if 'miesto' in request.GET: 
     print 'Yes' 
     return queryset 
    else: 
     print 'No' 

Here некоторое краткое объяснение от Django документы.

+0

Но могу ли я получить доступ к параметрам URL в методе 'get_queryset'? – programmer

+0

@programmer Я обновил свой ответ. Он принимает «запрос» в качестве аргумента, и вы можете получить GET и все остальное, что вам нужно оттуда. – wolendranh

+0

Я изменил 'queryset' на' get_queryset', но, к сожалению, поведение такое же. Фильтрованный набор запросов содержит правильные данные, но он просто не отображается в браузере ... Интересно, что он работает хорошо, только если у меня есть один параметр в строке запроса URL, например localhost: 8000/admin/mainApp/some_model /? location = someCity, но если у меня есть несколько параметров, отфильтрованный набор запросов не отображается ... – programmer

Смежные вопросы