1


現在、小さなデータベースの検索フォームを作成しようとしています。

これは私の models.py ファイルの一部です:

from django.db import models
from django import forms
#...
class searchForm(forms.Form):
   searchField = forms.CharField(max_length = 100)
#...

これは私の views.py ファイルの一部です:

from django.shortcuts import render
from django.http import HttpResponse
from django.http import HttpResponseRedirect
#...
def index(request):
   template = loader.get_template('index.html')
   context = Context({})
   return HttpResponse(template.render(context))

def search(request):
   if request.method == 'POST': # If the form has been submitted...
     form = searchForm(request.POST)# A form bound to the POST data
     if form.is_valid():
        searchData = form.cleaned_data['searchField']
        return HttpResponseRedirect('search.html') # Redirect after POST #???
   else:
     searchData = searchForm() # an unbound form

   return render(request, 'search.html', {'form': form,}) #???
#...

これは私のindex.htmlの一部で、そのフォームを実装したい場所です:

<label for="Search">Search:</label>
<form action = "/search/" method = "post">
    {% csrf_token %} {{ form.as_p }}
    <input type = "submit" value = "Go" />  
</form>

私がやろうとしていること:
フォームを送信すると、検索テキストフィールドからの入力が最初に表示される search.html という結果ファイルにリダイレクトしたいと思います。リンク構造は次のようになります:
Landing-Page is: http://127.0.0.1:8000/
after a submit form:http://127.0.0.1:8000/search.html

行を「???」でマークした検索方法にエラーがある可能性があります。次の問題は、検索テキスト フィールドが表示されないことです。

誰かが私にアドバイスを与えることができれば、素晴らしいでしょう。

ありがとう、エルジョブソ

4

2 に答える 2

3

最初:あなたが言うように、フォームを表示したいのですindex.htmlが、indexビューがテンプレートにフォームを渡していないため、フォームは表示されません。searchフォームをテンプレートに渡す場所が表示されます。

説明した動作が必要な場合は、次のようにコードを再編成する必要があります。

from django.shortcuts import render
from django.shortcuts import render_to_response
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.template.context import RequestContext

#...
def index(request):
   # this will only render the template with the form
   searchData = searchForm() # an unbound form
   return render_to_response(
        'index.html',
        context_instance=RequestContext(
            request,{'form':searchData,}
        )
    )

def search(request):
   if request.method == 'POST': # If the form has been submitted...
     form = searchForm(request.POST)# A form bound to the POST data
     if form.is_valid():
        searchData = form.cleaned_data['searchField']
        # do whatever you want to process the search with
        # searchada, maybe populate some variable
        return render_to_response(
            'search.html',
            context_instance=RequestContext(
                request,{'form':searchData,} # maybe add here the populated variable with the search
            )
        )
   else:
     # request.GET, just show the unbound form
     searchData = searchForm() # an unbound form

   return render_to_response(
        'search.html',
        context_instance=RequestContext(
            request,{'form':searchData,}
        )
    )

次に、テンプレートは次のようになります。

index.html

<!-- is not good to have a label outside form -->
<label for="Search">Search:</label>
<form action = "/search/" method = "post">
    {% csrf_token %} {{ form.as_p }}
    <input type = "submit" value = "Go" />  
</form>

またsearch.html、フォームもレンダリングするため、そのテキストはテンプレート内に含まれています。

これが何らかの光をもたらすことを願っています!

于 2013-05-24T13:05:59.280 に答える
1

django FormViewを使用すると、次のことができます。

class Index(FormView):
    form_class = SearchForm
    template_name = 'index.html'
    success_template = 'search.html' # I've added this attr

    def form_valid(self, form): #That return a your form, validated
      # Here you can do something with you VALID form.
      searchData = form.cleaned_data['searchField']
      context = dict(
            searchData=searchData,
        )
      return render_to_response(self.success_template, {}, RequestContext(self.request, context))
于 2013-05-24T13:18:47.143 に答える