I already have a valid search function mapped in my Django project, you type in a url '/project/search//' and it responds the corresponding search results on a page. I want to have a search box in my nav-bar that was created in my base.html and have users type in a query and it will redirect them to the search url. When I type into the search bar and click submit, however, the I am just directed to '/project/search/' with no relation to the query. How do I connect the form to redirect to the URL, properly??
Thanks in advance.
Here is my view definition and form class:
class SearchForm(forms.Form):
search_string = forms.CharField(max_length=100)
def search(request, search_query):
if request.method == 'GET':
form = SearchForm()
context = RequestContext(request)
search_string = search_query.replace('_',' ')
search_terms = search_query.split('_')
search_results = Article.objects.all()
for term in search_terms:
search_results = search_results.filter(article__icontains=term)
context_dict = {
'search_string':search_string,
'search_results':search_results,
'form':form,
}
if request.method == 'POST':
form = SearchForm(request.POST)
if form.is_valid():
search_string = form.data['search_string']
search_query = search_string.replace(' ','_')
###return HttpResponseRedirect(reverse('search', args=(search_query,)))
search_url = '/beacon/search/' + search_query + '/'
return HttpResponseRedirect(search_url)
else:
return render_to_response('search.html', context_dict, context)
My base form html is (yes it is from bootstrap):
<form action='/beacon/search/' class="navbar-form navbar-right" role="search" method='POST'>
<div class="form-group">
{% csrf_token %}
<input type="text" class="form-control" placeholder="Search Article Text">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
In your search method, if the request method was POST, you are trying
to retrieve submitted data via key 'search_string'. However, if you
look at your HTML form, there does not seem to be any kind of input
field called 'search_string'.
Try adding name="search_string" parameter to the input element, for
example:
<input type="text" name="search_string" class="form-control" placeholder="Search Article Text">
On a side-note, why are you even using POST method for a search? I
_think_ that GET should be sufficient, and probably more correct thing
to use, unless your searches are actually altering data (which could be
considered a bad practice).
I have tried hacking your code on top of one of my search pages, and
definitively managed to get it working once I added the name for the
input.
Without the name, the search view would otherwise just fall through and
I'd get something in the lines of the following error:
The view project.views.search didn't return an HttpResponse object.
I'd suggest maybe putting in a couple of debug print messages in your
view to figure out where your code ends-up in the end.
Best regards
--
Branko Majic