2016-04-12 6 views
2

一度入力すると、別のWebページに誘導されるか、無効な場合は同じページに残るシンプルなフォームを作成しようとしています。ページにはテキストボックスと提出フォームがあり、ユーザーが何かを入力すると別のページに誘導されます。DJANGO - データ付きPOSTから別のページにリダイレクト

次のように私のディレクトリ構造は次のとおりです。次のように

appName/ 
     app/ 
      forms.py 
      urls.py 
      views.py 
      templates/ 
       app/ 
       goodbye.html 
       name.html 
       library.html 
       thanks.html 
     appName/ 
      settings.py 
      urls.py 

マイアプリ/ urls.pyは次のとおりです。

from django.conf.urls import url 
from . import views 

app_name = 'app' 

urlpatterns = [ 
     url(r'^$', views.index2, name = 'index'), 
     url(r'^hello/$', views.hello, name = 'hello'), 
     url(r'^goodbye/$', views.goodbye, name = 'goodbye'), 
     #url(r'^library$', views.library, name = 'library'), 
     url(r'^library/$', views.library, name = 'library'), 
     url(r'^library/(?P<book_id>[0-9]+)/$', views.book, name = 'book'), 
     url(r'^getname/$', views.get_name, name = 'get_name'), 
     url(r'^your-name/$',views.get_name, name='get_name'), 
     url(r'^thanks/$',views.say_thanks,name='thanks'), 
     #url(r'^thanks/(?P<name_id>[a-zA-Z]+)/$', views.say_thanks,name='thanks'), 
     ] 

マイforms.pyは次のとおりです。

からdjangoインポートフォーム

class NameForm(forms.Form): 
    your_name = forms.CharField(label = 'Your name', max_length=100) 

マイアプリ/ views.pyです:

from django.http import HttpResponse 
from django.template import loader 
from django.shortcuts import render 
from django.http import HttpResponseRedirect 

#forms 
from .forms import NameForm 

# Create your views here. 
def index2(request): 
    return HttpResponse("hello world") 

def hello(request): 
    text = """<h1>Welcome to my app! </h1>""" 
    return HttpResponse(text) 

def goodbye(request): 
    template = loader.get_template("app/goodbye.html") 
    context = { 
     'output' : 'This is output from goodby views.py request handler' 
     } 

    return HttpResponse(template.render(context,request)) 

def library(request): 
    template = loader.get_template("app/library.html") 
    context = { 
     'output' : 'Welcome to the libary!!' 
     } 
    return HttpResponse(template.render(context, request)) 

def book(request, book_id): 
    return HttpResponse("You're looking at book %s. " % book_id) 

def get_name(request): 

    # if this is a POST request we need to process the form data 
    if request.method == 'POST': 
     # create a form instance and populate it with data from the request: 
     form = NameForm(request.POST) 
     # check whether it's valid: 
     if form.is_valid(): 
      #process the data in form.cleaned_data as required 
      locationGo = "/thanks/" 
      template = loader.get_template("app/thanks.html") 

      return HttpResponse(template.render({'name':'name'},request)) 
    else: 
      form = NameForm() 
      template = loader.get_template("app/name.html") 
      context = {'form': form} 
      return HttpResponse(template.render(context, request)) 

def say_thanks(request): 
    template = loader.get_template("app/thanks.html") 
    return HttpResponse(template.render({'name': 'name'},request)) 

私のテンプレートが含まれます:

名.html

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

goodbye.html

  1. に訪問するユーザー:名前を表示するようにwebsite.com/getname/私はようですどうなるか

    Thanks {{name}}! 
    

    thanks.html

    <h1>Goodbye to Template Romance</h1> 
    
    <a href="{% url 'app:index' %}">Go Back</a> 
    

    。 htmlファイル(それはあります)

  2. ユーザーが同じページ(web.com/.com/get name /)(これはありません:ValueError at/getname/- >ビューapp.views.get_nameはHttpResponseオブジェクトを返しませんでした。代わりにNoneを返しました。

  3. ユーザーがsubmitフィールドに入力してwebsite.com/thanks/にリダイレクトされた場合(これは並べ替えられますが、現在はthanks.htmlテンプレートが読み込まれていますが、URLはwebsite.com/getnameに残ります) /)get_nameインサイド

(リクエスト):機能、POSTとGETあれば...他には、[送信]ボタンに基づいて発射されていないようだ、とそれがロードされていないようです現在のURLアドレスを処理した後に変更してください。私はHttpRedirect()を使って試してみましたが、フォームデータ(別の問題です)も渡したいと思います。

どのような提案が大きな助けになるでしょう!

答えて

3

最初の問題は、リクエストメソッドがポストで、フォームが無効な場合にレスポンスを返さないことです。ビューのインデントを変更することで修正することができ、ビューの最後に常に応答を返すことができます。

def get_name(request): 

    # if this is a POST request we need to process the form data 
    if request.method == 'POST': 
     ... 
    else: 
     form = NameForm() 
    template = loader.get_template("app/name.html") 
    context = {'form': form} 
    return HttpResponse(template.render(context, request)) 

あなたは/thanks/ビューにリダイレクトしたい場合は、リダイレクトのショートカットを使用することができます。 (説明のためthis question参照)フォームデータをリダイレクトし、通過することができないこと

if form.is_valid(): 
     return redirect('thanks') 

注意。データで任意の処理を実行してから、をリダイレクトする必要があります。リダイレクトする前にmessages frameworkを使用して'Thanks <name>'というメッセージを作成することができます。

URLパターンにname='thanks'があるため、これは機能します。

renderショートカットを使用すると、ビューを簡素化できます。代わりに

template = loader.get_template("app/name.html") 
context = {'form': form} 
return HttpResponse(template.render(context, request)) 

のあなたは、単に行うことができます。

return render(request, "app/name.html", context) 

は、ショートカットの輸入を追加することを忘れないでください:

from django.shortcuts import redirect, render 
関連する問題