2016-12-23 7 views
1

私は、サブミットしてアイテムをデータベースにアップロードするフォームを作成しました。問題は、URLが異なるため、私はf5キーを押すとフォームを再度送信することです。URLパターンを使用する適切な方法

私はこれらの2つのURLパターン

urlpatterns = [ 
      url(r'(?i)^CMS/$', views.CMS, name='CMS'), 

      url(r'^createItem/$', views.createItem, name='createItem') 
] 

を持っており、私の見解では、この

def CMS(request):  
    form = itemCreateForm() 

    context = { 
      'form' : form, 
      'message' : 'Content Manage Site' 
    } 
    return render(request, 'CMS.html', context) 

def createItem(request):  
    f = itemCreateForm(request.POST) 

    if f.is_valid(): 
     f.save() 
     pass 

    form = itemCreateForm() 

    context = { 
      'form' : form, 
      'message' : 'ItemCreated!' 
    } 

    return render(request, 'CMS.html', context) 

CMS.html

{% if message %} 
    {{ message }} 
{% endif %} 

<div class='newItemFields'> 
    <form action="{% url 'kar:createItem' %}" method="POST"> 
    {% csrf_token %} 
     {{ form.as_p }} 
     <input type="submit"> 
    </form> 
</div> 

私のフォーム

class itemCreateForm(ModelForm): 
    class Meta: 
     model = item 
     fields = ['name', 'type', 'price'] 
のように見えます

私はホームページ/ CMS /で始まり、フォームに記入してsubmitを押すと、表示機能createItemが実行され、オブジェクトが作成されてデータベースに保存されます。ユーザーをホームページ/ CMS/createItemに送信します。そして、今度はユーザがf5キーを押すたびに、入力フィールドが空でも(私の頭を囲むことはできませんが)、createItem関数が再度実行され、前のものと同じ値を持つ別のオブジェクトをデータベースに挿入します。

また、私は二度と疑問を感じるform = itemCreateForm()を書きますか?

私がしたいのは、createItemを実行した後、homepage/CMS/createItemではなくホームページ/ CMS /にユーザーを戻す必要があるということです。それが正しい方法でしょうか?または、これを行うためのスマートな方法があります。

+0

が、これは今整理されたテンプレート

<div class='newItemFields'> <form action=method="POST"> {% csrf_token %} {{ form.as_p }} <input type="submit"> </form> </div> 

メッセージ表示部に小さな変更を必要とし、もう必要ありませんか? – e4c5

答えて

1

createItem関数の最後では、リダイレクトではなくページのHTMLをレンダリングしています。代わりに、あなたはあなたがHttpResponseRedirectをインポートし、その名によってURLを解決するために使用されて逆にする必要があります。

return HttpResponseRedirect(reverse('kar:index')) 

を行う必要があります。

チェックこのアウト:https://docs.djangoproject.com/en/1.10/topics/forms/#the-view

+0

これを試してみて、それは私にdjango.core.urlresolvers.NoReverseMatchを与えました:引数 '()'とキーワード引数 '{}'で 'index'を逆転させました。 1つのパターンが試されました:['Homepage /(?i)^ $'] – vandelay

1

は、私は何をしたいcreateItemが実行された後で、それはホームページ/ CMS /及びませんホームページ/ CMS/createItemに戻っ ユーザーを送信する必要があります。その は適切な方法でしょうか?または、これを行うためのスマートな方法があります。

これは本当に適切かつスマートな方法です。 1つのビューでGETとPOSTの両方を処理し、フォームの送信が成功した後にリダイレクトします。これにより、ユーザーは単にリフレッシュするだけでフォームを再送信できなくなります。また、コードの繰り返しに関する懸念にも取り組んでいます。フォームが有効でない場合

urlpatterns = [ 
    url(r'(?i)^$', views.index, name='index'), 
    url(r'^createItem/$', views.createItem, name='createItem') 
] 

次に、あなたのビューのコードは今短いこと

def createItem(request):  
    if request.method == 'POST': 
     f = itemCreateForm(request.POST) 

     if f.is_valid(): 
      f.save() 
      return HttpResponseRedirect('/homepage/CMS/') 
    else : 
     form = itemCreateForm() 

     context = { 
       'form' : form, 
       'message' : 'Content Manage Site' 
     } 
    return render(request, 'CMS.html', context) 

注意を組み合わせ、それがユーザーに適切なフィードバックを提供します。そして、それを2回提出するために更新することはできません。私たちは、

+0

ごめんなさい申し訳ありませんURLパターンに間違ったURLを書きました。インデックス付きではなく、CMSであるべきである。しかし、これは何か変わるでしょうか? – vandelay

+0

心配なし。大きな変化はありません。あなたは好きなときにいつでもurls.pyを変更することができます。リダイレクトが(reverse name)関数を使ってリダイレクトされないようにすることができます(urlに名前を付ける) – e4c5

関連する問題