2

我第一次尝试创建一个小型 django 应用程序。它只是一个基本页面,有两个表单,一个从数据库返回值的搜索表单(运行良好)和一个插入表单(问题)。在插入表单中,有三个文本字段要求数据库中新行的值。该应用程序称为“搜索器”。这是我的代码:

视图.py

from django.http import HttpResponse
from django.template import Context
from django.template.loader import get_template
from searcher.models import Publisher
from django.db.models import Q

def search(request):
    if "search" in request.GET:
        value = request.GET['search']
        results = Publisher.objects.filter(Q(city__contains=value) | Q(name__contains=value))

    else:
        value = "No term"
        results = []
    template = get_template("base.html")
    html = template.render(Context({"value":value, "results":results}))
    return HttpResponse(html)

def insert(request):
    if "name" in request.POST:
        for key in request.POST:
            counter = 0
            if key != '':
                counter = counter + 1
        if counter == len(request.POST):
            row = Publisher(name=request.POST['name'], city=request.POST['city'], website=request.POST['website'])
            row.save()      

base.html

<html>
    <body>
        <form method = "GET" action = "">
            <input type  = "text" name = "search"><input type = "submit">
        </form><br>

        you searched for:{{value}}<br>

        your results:
        {% for result in results %}
            <br>{{result}}<br>
        {% endfor %}    
        <br><br>
        <form method = "POST" action = "/test/insert/">
            <input type  = "text" name = "name" value = "name"><br>
            <input type  = "text" name = "city" value = "city"><br>
            <input type  = "text" name = "website" value = "website"><br>
            <input type = "submit">
        </form>
    </body>
</html>

网址.py

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

urlpatterns = patterns('',
    url(r'^test/$', views.search),
    url(r'^test/insert/$', views.insert),
)

错误是说“/test/insert 的 ValueError 视图 searcher.views.insert 没有返回 HttpResponse 对象。” 由于我提交了插入表格。

我明白错误在说什么:抱歉,views.py 中的所有视图都必须返回要显示的内容。

首先这是为什么?

其次,完成插入表单的正确方法是什么?目前我已经设置了表单 action = "/test/insert/" 以便在 urls.py 中它可以识别插入表单已提交并调用函数插入,应该如何调用该函数?

4

2 回答 2

3

你好像在问两个问题

  1. “为什么所有视图都必须返回一些东西来显示?”

    您误解了错误消息。您看到的错误并没有说“所有视图都必须返回要显示的内容” - 它只是说“searcher.views.insert 没有返回预期的 HttpResponse”。由于您正在处理 HTTP 请求(表单 POST),因此您需要发回 HTTP 响应。所有 HTTP 请求都期望得到响应 - 这是关于如何通信的标准协议的问题 - 详细信息是http 标准定义的一部分,并在此答案中有所解释。

  2. “完成插入表格的正确方法是什么?”

    您正在正确实施它 - 只需为 POST 发回 HTTP 响应。它的代码几乎与您为响应搜索请求而发回的代码相同(也许您需要添加一条消息,说明插入已成功完成,在搜索请求中您可能已返回的项目正在搜索?)。

    如果您想避免完全刷新表单,您可能希望再次使用 ajax 调用,而不是 http 调用,如此所述。

于 2013-09-21T22:07:05.140 回答
1

所有视图都必须返回一个HttpResponse对象,因为这是服务器返回给最初发出请求的浏览器的内容。几乎按照定义,视图是接受请求对象并返回响应对象的可调用对象。

在views.py 中有不返回响应的代码是可以的,例如视图的辅助函数,但是将这样的代码用作视图就不好了。

处理 POST 请求时的常用模式是在成功时返回到成功页面的重定向,并在失败时重新显示带有适当错误消息的表单。例如,参见“在视图中使用表单”文档。

于 2013-09-21T22:09:24.497 回答