2

初めて、小さな django アプリケーションを作成しようとしています。これは、データベースから値を返す検索フォーム (うまく機能) と挿入フォーム (問題) の 2 つのフォームを持つ単なる基本的なページです。挿入フォームには、データベースの新しい行の値を求める 3 つのテキスト フィールドがあります。アプリは「サーチャー」と呼ばれます。これが私のコードです:

ビュー.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>

urls.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 で挿入フォームが送信されたことを認識し、insert 関数を呼び出すことができるようにしましたが、代わりにどのように関数を呼び出す必要がありますか?

4

2 に答える 2

3

あなたは2つの質問をしているようです

  1. 「なぜすべてのビューが表示するものを返さなければならないのですか?」

    エラーメッセージを誤解しています。あなたが見たエラーは、「すべてのビューは何かを返さなければならない」とは言いませんでした. HTTP リクエスト (フォーム POST) を扱っているため、HTTP レスポンスを返す必要があります。すべての HTTP リクエストは応答を期待します。これは、通信方法に関する標準合意の問題です。詳細は、http 標準定義の一部であり、この回答の一部として説明されています。

  2. 「挿入フォームを完成させる正しい方法は何ですか?」

    正しく実装しています。POST に対して HTTP 応答を返すだけです。そのコードは、検索リクエストに応答して送り返すものとほとんど同じです (挿入が正常に完了したことを示すメッセージを追加したい場合があります。検索リクエストでは、捜索中?)

    フォーム全体を更新する必要がないようにしたい場合は、ここで説明されているように、http 呼び出しの代わりに ajax 呼び出しを使用することをお勧めします。

于 2013-09-21T22:07:05.140 に答える
1

すべてのビューはHttpResponseオブジェクトを返す必要があります。これは、サーバーが最初に要求を行ったブラウザーに返すものであるためです。ほぼ定義上、ビューはリクエスト オブジェクトを受け取り、レスポンス オブジェクトを返す呼び出し可能オブジェクトです。

ビューのヘルパー関数など、応答を返さないコードを views.py に含めることは問題ありませんが、そのようなコードをビューとして使用することは問題ありません。

POST リクエストを処理するときの通常のパターンは、成功すると成功ページへのリダイレクトを返し、失敗すると適切なエラー メッセージとともにフォームを再表示することです。たとえば、「ビューでフォームを使用する」ドキュメントを参照してください。

于 2013-09-21T22:09:24.497 に答える