Django中的简单用户输入

17 投票
2 回答
46615 浏览
提问于 2025-04-18 15:17

我现在遇到的问题是,我不太明白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('\\','/'),
)

撰写回答