Django Search via Form Redirect to URL

912 views
Skip to first unread message

Conner DiPaolo

unread,
Jul 27, 2014, 6:11:20 PM7/27/14
to django...@googlegroups.com

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>

Branko Majic

unread,
Jul 28, 2014, 7:42:07 AM7/28/14
to django...@googlegroups.com
On Sun, 27 Jul 2014 15:11:20 -0700 (PDT)
Conner DiPaolo <cdipa...@gmail.com> wrote:

>
>
> 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):
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).

Best regards


--
Branko Majic
Jabber: bra...@majic.rs
Please use only Free formats when sending attachments to me.

Бранко Мајић
Џабер: bra...@majic.rs
Молим вас да додатке шаљете искључиво у слободним форматима.
signature.asc

Conner DiPaolo

unread,
Jul 28, 2014, 10:41:23 AM7/28/14
to django...@googlegroups.com, bra...@majic.rs


On Monday, July 28, 2014 4:42:07 AM UTC-7, Branko Majic wrote:

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).

 Thanks for the response. I tried putting a name into the text input field but nothing changes- I am still redirected to /project/search/ and not /project/search/<query>/   . I have also tried to just use the default Django form link template tag with {{ form.search_string }} with the same result, which leads me to think that the issue has to do with maybe the submit button? I'm not sure, though...

I agree that POST is probably the less 'correct' thing to do here, the perfect example for using GET is ironically (in the Django docs themselves) a search bar. That said, I get so confused and frustrated when I have to use forms that I want to have a working prototype before I change it as most of the form tutorials out there use POST because they change models or something.

Seriously thanks for the response!
Conner DiPaolo

Branko Majic

unread,
Jul 28, 2014, 2:49:12 PM7/28/14
to django...@googlegroups.com
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.
signature.asc

Conner DiPaolo

unread,
Jul 28, 2014, 5:57:36 PM7/28/14
to django...@googlegroups.com, bra...@majic.rs


On Monday, July 28, 2014 11:49:12 AM UTC-7, Branko Majic wrote:
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

Ok I did what you said and played around for a while and got it working! Thanks! Another issue I had which I think was the main one (as well as the namespace in my input) was that I needed to change my action to link to a url which validated my search view. I ended up just using /beacon/search/search_query/ but anything instead of search_query would have worked. This way Django runs through the search view no matter what page you are on. Ironically changing that also implemented my search function on the whole site because the form is in my base.html .

Seriously thanks for the help dude!

-Conner DiPaolo 
Reply all
Reply to author
Forward
0 new messages