Django中的简单用户输入
我现在遇到的问题是,我不太明白Django中的模板、视图和网址是怎么联系在一起的……有没有最简单的方法,让用户输入一个字符串,然后用这个字符串去查询数据库(最好是用Python模型,而不是直接写SQL语句)?我应该使用GET和POST方法吗?我需要用表单吗?我必须使用模板,还是可以用通用视图?
当我尝试提交输入时,它只是重新加载了输入页面。
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'),
)
模板:
<form method="POST" action="send/">
{% csrf_token %}
<input type="text" name="textfield">
<button type="submit">Upload text</button>
</form>
我是不是漏掉了什么,或者做错了什么?
2 个回答
3
对于用户输入,你需要两个视图——一个是用来显示表单的页面,另一个是用来处理数据的。你可以把第一个视图连接到一个网址,比如“feedback/”,而第二个视图可以连接到一个像“feedback/send/”这样的网址。你还需要在你的表单标签中指定这个第二个网址。
<form method="POST" action="feedback/send/">
<input type="text" name="textfield">
...
<button type="submit">Upload text</button>
</form>
在第二个视图中,你可以获取表单数据,然后随便处理这些数据。
def second_view(request):
if request.method == "POST":
get_text = request.POST["textfield"]
# Do whatever you want with the data
可以看看这个页面 Fun with Forms。它会给你一些基本的理解。我也建议你把整本书都看一遍。你可以使用GET或POST(GET可能不太安全)。使用表单并不是必须的,因为你可以自己设计样式,进行所有的验证,然后直接把数据传给模型。
20
如果我理解得没错,你想从用户那里获取一些输入,然后查询数据库,并根据这些输入向用户展示结果。为此,你可以创建一个简单的 Django 表单来接收用户的输入。接着,你可以通过 GET
请求把这个参数传递给一个视图,然后在数据库中查询相关的关键词。
编辑: 我已经修改了代码。现在应该可以正常工作了。
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>
另外,确保你把模板放在一个单独的文件夹里,命名为 templates
,并在你的 settings.py
文件中添加这个内容:
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), '../templates').replace('\\','/'),
)