2016-08-08 4 views
0

Я пытаюсь реализовать панель поиска, чтобы запросить мою базу данных и показать только совпадения. Когда я нажимаю «Отправить», он просто возвращает «ПОИСК», что я установил как значение по умолчанию вместо печати ошибки.Django Search Bar Реализация

ajax.py

... 
def chunkSearcher(request): 
test = request.GET.get('search_box', "SEARCH") 
print(test) 
.... 

Searcher.html

<form type="get" action="." style="margin: 0"> 
<input id="search_box" type="text" name="search_box" value="Search..." > 
<button id="search_submit" type="submit" >Submit</button> 

urls.py

url(r'^ajax/chunk/Searcher/$', 
    ajax.chunkSearcher, name='chunkSearcher') 

views.py (Это на самом деле работает здесь по какой-то причине, но он не будет признавать те же две строки кода в моем АЯКС код

def searcher(request): 
# test = request.GET.get('search_box', "SEARCH") 
# print(test) 
this_main = Searcher(
    request   = request, 
    num_elements  = Candidate.objects.all().count(), 
    size    = 'col-xs-12', 
    title   = 'Search', 
    modelname  = 'Searcher', 
    listing_fields = [ 
     {'readable_name': 'Name', 'model_attribute': 'full_name()', 'subtext_model': 'email', 'color': 'False'}, 
     {'readable_name': 'Status', 'model_attribute': 'get_status_display()', 'color': 'True'}, 
     {'readable_name': 'Automated Status', 'model_attribute': 'get_auto_status()', 'color': 'True'}, 
     {'readable_name': 'Submitter', 'model_attribute': 'submitter', 'color': 'True'}, 
    ], 
    listing_actions = [ 
     {'tooltip': 'Search', 'color': 'success', 'icon': 'plus', 'permission': 'prog_port.add_candidate', 'modal': 'candidateform', 'controller': 'addCandidate'}, 
    ], 
) 

context = { 
    'nav' : Nav(request), 
    'main' : this_main, 
    'fb'  : TestFeedback() 
} 
return render(request, 'prog_port/base.html', context) 

widgets.py

class Searcher: 
def __init__(self, request, 
        num_elements, 
        size       = 'col-xs-12', 
        modelname     = None, 
        title      = None, 
        listing_fields    = None, 
        listing_actions    = None):#!! 

    self.template = 'prog_port/widgets/Searcher.html' 
    self.size = size 
    self.modelname = modelname 
    self.num_elements = num_elements 
    self.num_pages = int(math.ceil(num_elements/25.0)) 
    self.title = title 
    self.listing_fields = [x['readable_name'] for x in listing_fields] 
    self.listing_actions = listing_actions 

    for action in self.listing_actions: 
     action['restricted'] = False 
     if 'permission' in action: 
      if not request.user.has_perm(action['permission']): 
       action['restricted'] = True 
+0

Что произойдет, если вы измените атрибут 'action' вашей формы, чтобы указать URL-адрес вашего представления ajax? – souldeux

+0

@souldeux Когда я изменяю действие на 'action ="/ajax/chunk/Searcher ", текст, который я ввел в поле, фактически выливается в мой терминал, но страница не загружается. ** Перед ** 'ПОИСК [08/Август/2016 13:18:54] "GET/Ajax/фрагмент/Searcher /? Страница = 1 & OrderBy = 0% 3Basc HTTP/1.1" 200 4467' * * После ** '[08/Aug/2016 14:12:30]« GET/ajax/chunk/Searcher /? Page = 1 & orderby = 0% 3Basc HTTP/1.1 "200 4243 [08/Aug/2016 14: 12:37] «GET/ajax/chunk/Searcher? Search_box = Test + Search HTTP/1.1" 301 0 Поиск теста [08/Aug/2016 14:12:37] "GET/ajax/chunk/Searcher /? search_box = Test + Поиск HTTP/1.1 "200 4240' –

ответ

0

Получение этой работы без Ajax было бы немного быстрее начать. Когда атрибут action вашей формы указывает на URL-адрес текущей страницы (а не на URL-адрес вашего представления ajax), запрос GET отправляется в представление, соответствующее URL-адресу этой страницы, - ваш вид searcher в вашем случае. Вот почему вы смогли получить ожидаемые значения для печати, когда у вас были эти две строки в этом представлении.

Главное, поскольку вид searcher - это тот, который отдает вашу страницу, имея доступ к вашему search_box значению в этом представлении, которое позволяет фильтровать или иным образом манипулировать набором запросов, передаваемым в контекст представления, и в конечном итоге отображать только объекты с ограничением/фильтром, которые вы хочу показать.

Отдельный вид Ajax не имеет доступа ко всем этим вещам сразу с места в карьер. Чтобы динамически обновлять результаты поиска с помощью отдельного представления Ajax, этому представлению необходимо будет ответить на ваш запрос со всей информацией, необходимой для повторной обработки страницы соответствующим образом. Практически, это обычно означает, что одна из двух вещей:

  1. Ваших результатов поиска отображается в пределах определенной области контента div или другой, и ваш взгляд Ajax возвращает HTML, необходимый для заполнения, что область содержимого с соответствующим материалом, или

  2. Ваш первоначальный вид отображает его шаблон на основе некоторого сериализованного JSON, и ваше представление Ajax предоставляет обновленную информацию в этом формате, которая затем используется для повторной визуализации шаблона.

This is a good starting point for getting the hang of ajax with django. Обратите внимание в примере код, указанный как вид отвечает на вызов Ajax с некоторыми data (а HTTPResponse или оказанные шаблон), и как это data затем используется в функциях успех/провал.

Если ваш ajax-представление возвратил HTML-код, необходимый для рендеринга результатов поиска, вы можете использовать свою функцию успеха, чтобы обновить результаты поиска div (или таблицу или что-то еще) на вашей странице с помощью этого нового HTML-кода.Например:

views.py

def index(request): 
    return render(request, "index.html") 

def ajax_update(request): 
    return HttpResponse("<h1>Updated Header</h1>") 

index.html

... 
<div id="update_this_header"> 
    <h1>Old header</h1> 
</div> 
<button id='updater'> 
... 
<script> 
$("#updater").click(function() { 
    $.ajax({ 
     url: #url to ajax_update view 
     success : function(data) { 
      $("#update_this_header").html(data) 
     }, 
     failure : function(data) { 
      ... 
     } 
    }); 
}); 
</script> 

Теперь, нажав на кнопку updater следует обновить содержимое update_this_header DIV с HTML вернулся в HttpResponse из нашего ajax_update (я признаю, что не проверял это, простите меня, если есть опечатка). Обновление результатов поиска работает одинаково; вам просто нужно сделать больше обработки в своем представлении ajax, чтобы ответить на правильный HTML.

Я надеюсь, что это поможет сделать вещи несколько яснее; пожалуйста, дайте мне знать, если я могу (попытаюсь) объяснить что-либо более полно. Важным выводом здесь является то, что представление ajax предоставит вам некоторые данные. Это зависит от вас, чтобы ваш шаблон мог принимать эти данные и правильно отображать их.