2012-04-13 9 views
0

私は自分のデータベースの中に入って、特定の提出が以前に提出されたかどうか、そしてそれが再提出を停止しているかどうかを確認しようとしています。現在、私は、フォームの各フィールドをテストコードのこのビットを持っている(明らかにフィールドごとに変わりますが、私は私だけ簡単にするために一つのフィールドを表示しようと思いました)、それはそれが経つ存在して保存していない場合は、Djangoデータベースに関するお問い合わせデータベースに重複を見つけて送信を停止する

if request.method == 'POST': 
    Cashtexts.objects.filter(cashTexts=request.POST['cashTexts']).exists() == False: 

をデータベースに提出する。 trueを返すと、入力した内容が既に入力されていることをユーザーに知らせるelseステートメントに進みます。以前はこのタイプのものが働いていましたが、いくつかの変数名が変更され、現在は機能しなくなっています。私はコードをしばらくブラウジングしていたので、このタイプのフィルタでは根本的に何かが間違っていたかもしれないと思っていましたが、私の頭の中では理にかなっています。

def submit_win(request): 
    if request.method == 'POST': 
     if Cashtexts.objects.filter(cashTexts=request.POST['cashTexts']).exists() or Cashtexts.objects.filter(superPoints=request.POST['superPoints']).exists() or Cashtexts.objects.filter(varolo= request.POST['varolo']).exists() or Cashtexts.objects.filter(swagbucks = request.POST['swagbucks']).exists() or Cashtexts.objects.filter(neobux = request.POST['neobux']).exists() or Cashtexts.objects.filter(topline=request.POST['topline']).exists() or Cashtexts.objects.filter(Paidviewpoint=request.POST['Paidviewpoint']).exists() or Cashtexts.objects.filter(cashcrate=request.POST['cashcrate']).exists() == False: 
      form = CashtextsForm(request.POST) 
      if form.is_valid(): 
       form.save() 
       ref_create = Cashtexts.objects.filter(cashTexts=request.POST['cashTexts']) 
       return render_to_response('submitted_page.html', {'ref_create': ref_create}) 
     else: #Error message reading wither you didnt insert codes or you enter the same code twice 
      error = 'That code has already been submitted' 
      ref_create = CashtextsForm() 
      return render_to_response('submit.html', {'ref_create': ref_create,'error':error}, context_instance=RequestContext(request)) 
    else: #displays the page when the user asks to go to the submit page 
     ref_create = CashtextsForm() 
     return render_to_response('submit.html', {'ref_create': ref_create}, context_instance=RequestContext(request)) 

また、私は変数intoa Cashtexts.objects.filter(cashTexts = request.POST [「cashTextsを」])なって、それが戻ったかを見るために私のテンプレートに渡され、それが持つべきオブジェクトを返していました本当の声明を語った。とにかくそれを無視して提出するように見えました。

提出時に入力したものと一致する以前のすべてのオブジェクトを削除することができますが、それは安全性が低くなり、ユーザーが繰り返し投稿していると考えていることにつながります。私はそれが起こる前に、むしろそれを止めるだろう。

答えて

1

は、あなただけのモデル定義でユニークにごcashTextsフィールドの定義を設定することができます。

def Cashtexts(models.Model): 
    name = CharField(max_length=50, unique = True) 

はちょうどあなたがユニークになりたい各フィールドをtrueに「ユニークな」引数を設定すれば完了です。 DjangoのフォームAPIが動作する方法は、フォームフィールドが必要なエラー処理をすべて引き継ぎます。あなたはこのはるかに簡単に持つことができ、必要なユニークに設定モデルフィールドで


def view(request): 

    if request.method == 'POST': 
     form = CashtextsForm(request.POST) 

     """ the next line is going to check uniqueness for each 
      of the models fields where you have set unique = True 
      If the field is not unique, it s field will have an 
      attribute error, which you can then render to the template """ 
     if form.is_valid(): 
      form.save() 
    else: 
     form = CashtextsForm() 

    context = RequestContext(request) 

    # now i pass the form to the template as 'ref_create' 
    context.update({'ref_create':form}) 
    return render_to_response('submit.html',context) 

は、次に、あなたは、単にあなたのテンプレートでそのフォームをレンダリング(どちらかform.as_pと()、フォーム。 (as_table)、またはこのようないくつかのカスタムコード)を持つ:

{% for field in ref_create %} 
    {{ field.label_tag }} 
    {{ field }} 
    {{ field.errors }} 
{% endfor %} 

各フィールド、モデル定義にユニークに設定され、データベース内でユニークでなければなりません。これはあなたのフォームが保存されている場合、それ以上、時間になりましたでしょう「この名前のCashtextは既に存在する」のようなエラーメッセージが表示されます。あなたのエラーメッセージをカスタマイズ


は、2つの方法で行うことができます:1:フォームをカスタマイズする(あなたはDjangoがどのように動作するかのより良い理解を持ってまで、私は、それをお勧めしません)2:代わりに、このような{{ field.errors }}書き込み何かを:

{% if field.errors %} 
    The Cashtext field {{field.name}} value should be unique. 
{% endif %} 
+0

これは機能しません。私はdbとsync'dを新しいものに落としました、そして今私は新しいエラーが表示されます。ビューusers.views.submit_winはHttpResponseオブジェクトを返しませんでした。ときにバインドされていない形式を示すGETのためのelseを持っています。理由はわかりません – city

+0

あなたのビューコードなしでは何も言えません。 – marue

+0

申し訳ありませんが、そのページのビューを追加しました – city

関連する問題