12

私はdjangoを初めて使用し、非常に単純なことをするのに苦労しています。私はModelForm次のモデルのために持っています:

class Queries(models.Model):
    user_id=models.CharField(max_length=200)
    query=models.CharField(max_length=200)

そして、私はユーザーに次のことを行うのに役立つ簡単なフォームを示しています。

  • ユーザーが質問します
  • 質問が処理されます(データベースクエリは質問に基づいて生成されます)

  • 次に、クエリ結果が同じページのフォームのすぐ下に表示されます。

これは私のviews.pyがどのように見えるかです:

from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render
from basicapp.models import QueryForm

def index(request):
    form=MyForm()
    real_form=form.getForm(request)
    response=form.response
    return render(request,'basicapp/index.html',{
        'form': real_form,
        'response':response,
    })
class MyForm:
    response=''
    def getForm(self,request):
        form = QueryForm(request.POST)
        if form.is_valid():
            response=form.cleaned_data['query']
            form.save()
        return form

今のところ私は簡単なことを試しています。フォームのクエリフィールドの値を取得してページに送り返そうとしています。これまでのところ失敗しています。これはindex.htmlです:

<form action=" " method="post">{% csrf_token %}
{{ form }}
<p>{{response}}</p>
<input type="submit" value="Submit" />
</form>

これができれば、クエリはそれほど難しくないと思います。フォームは正常に機能しており、データはデータベースに保存されています。フォームの送信後、responseからの文字列のみviews.pyを内部で取得できませんでした。index.html手伝ってもらえますか?

編集:index.htmlホフの答えに基づいてフォローしてみました:

<form id="myForm" action=" " method="get">{% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
</form>
<div id="response">
</div>
<script language="JavaScript">
    $(document).ready(function() {
        $("#myForm").submit(function() { // catch the form's submit event
            $.ajax({ // create an AJAX call...
                data: $(this).serialize(), // get the form data
                type: $(this).attr('GET'), 
                success: function(response) { // on success..
                    $("#response").html(response); // update the DIV
                }
            });
            return false;
        });
    });
</script>

まだ運がない:(

4

4 に答える 4

12

views.py

def index(request):
    questions=None
    if request.GET.get('search'):
        search = request.GET.get('search')
        questions = Queries.objects.filter(query__icontains=search)

        name = request.GET.get('name')
        query = Queries.object.create(query=search, user_id=name)
        query.save()

    return render(request, 'basicapp/index.html',{
        'questions': questions,
    })

html

<form method="GET">
    Question: <input type="text" name="search"><br/>
    Name: <input type="text" name="name"><br/>
    <input type="submit" value="Submit" />
</form><br/><br/>


{% for question in questions %}
<p>{{question}}</p>
{% endfor %}
于 2013-02-12T17:38:17.600 に答える
4
<input type="text" name="query" />
<input type="submit" name="submit" value="Submit" />

フォームが送信されたかどうか(つまり、POSTリクエストかどうか)を確認できます。

if 'submit' in request.POST: #you could use 'query' instead of 'submit' too
    # do post related task
    # add context variables to render post output
    # add another context variable to indicate if it's a post
    # Example:
    context.update({'post_output': request.POST.get('query','')})
...
return render(request, 'index.html', context)

次に、テンプレートで、コンテキスト変数post_outputが存在するかどうかを確認し、出力が表示されるかどうかを確認します。

{% if post_output %}
    Output: {{ post_output }}
{% endif %}


要するに、ロジックは次のとおりです。

  1. 関連するrequest.POSTdictキーがビューに存在するかどうかを確認します。
  2. キーが存在する場合、それはPOSTリクエストです。投稿関連のコンテキスト変数を追加し、投稿関連のタスクを実行します。
  3. テンプレートで投稿関連のコンテキスト変数が使用可能かどうかを確認し、使用可能な場合は投稿関連の出力を表示します。

投稿後にページが単純に更新されたときに出力を表示したくない場合は、requestオブジェクトをテンプレートに渡し、次のようなチェックを行います。

{% if request.POST.submit and post_output %}
于 2017-06-25T16:07:52.513 に答える
3

必要なのは非同期投稿(ajax)で、これはjQueryで簡単です。完全な解決策については、次の回答を参照してください:AJAXとjQueryを使用してdjangoフォームをPOSTする方法

于 2013-02-12T16:42:52.570 に答える
1

ホフの答えに続いて...

ajax呼び出しにURL属性を追加します。

$(document).ready(function() {
    $("#myForm").submit(function() { // catch the form's submit event
        $.ajax({ // create an AJAX call...
            data: $(this).serialize(), // get the form data
            type: $(this).attr('GET'),
            url: '/URL-to-ajax-view/',
            success: function(response) { // on success..
                $("#response").html(response); // update the DIV
            }
        });
        return false;
    });
});

views.pyのいくつかのajaxハンドラー:

# /URL-to-ajax-view/
def ajax_get_response(request):
    if request.method == "GET" and request.is_ajax:
        form = QueryForm(request.POST or None)
        if form.is_valid():
            form.save()
            return HttpResponse(form.response)  
    raise Http404

そのようなことを試みましたか?

于 2013-02-12T17:51:47.267 に答える