Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Very simple user input in django

My underlying struggle is I am having trouble understanding how django templates, views, and urls are tied together... What is the simplest, bare minimum way to prompt the user to input a string, then use that string to query a database (preferably w/ python model not raw sql queries)? Should I use GET and POST methods? Should I use a form? Do I need to use a template or can I use a generic view?

when i try submitting input it just reloads the input page.

views.py:

from django.shortcuts import render
from django.shortcuts import HttpResponse
from People.models import Person

def index(request):
    return render(request, 'People/index.html')

def search(request):
    search_id = request.POST.get('textfield', None)
    try:
        user = Person.objects.get(MAIN_AUTHOR = search_id)
        #do something with user
        html = ("<H1>%s</H1>", user)
        return HttpResponse(html)
    except Person.DoesNotExist:
        return HttpResponse("no such user")  

urls.py

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^People/', 'People.views.index'), 
    url(r'^People/send/', 'People.views.search'),
)

template:

<form method="POST" action="send/">
{% csrf_token %}
<input type="text" name="textfield">

<button type="submit">Upload text</button>
</form>

Am I missing something or doing something wrong?

like image 519
Rick James Avatar asked Jul 30 '14 04:07

Rick James


1 Answers

If I understand correctly, you want to take some input from the user, query the database and show the user results based on the input. For this you can create a simple django form that will take the input. Then you can pass the parameter to a view in GET request and query the database for the keyword.

EDIT: I have edited the code. It should work now.

views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse
from .models import Person
from django.core.exceptions import *

def index(request):
    return render(request, 'form.html')

def search(request):
    if request.method == 'POST':
        search_id = request.POST.get('textfield', None)
        try:
            user = Person.objects.get(name = search_id)
            #do something with user
            html = ("<H1>%s</H1>", user)
            return HttpResponse(html)
        except Person.DoesNotExist:
            return HttpResponse("no such user")  
    else:
        return render(request, 'form.html')

urls.py

from django.conf.urls import patterns, include, url
from People.views import *

urlpatterns = patterns('',
    url(r'^search/', search),
    url(r'^index/', index)
)

form.html

<form method="POST" action="/search">
{% csrf_token %}
<input type="text" name="textfield">

<button type="submit">Upload text</button>
</form>

Also make sure that you place your templates in a seperate folder named templates and add this in your settings.py:

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), '../templates').replace('\\','/'),
)
like image 68
Archit Verma Avatar answered Sep 30 '22 00:09

Archit Verma