0

データベースの内部にアクセスして、特定の提出が以前に提出されたかどうか、およびそれが再度提出されないようにしているかどうかを確認しようとしています。現在、フォームの各フィールドをテストするこのコードがあります(明らかにフィールドごとに変更されますが、簡単にするために1つのフィールドのみを表示すると思いました)

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))

また、Cashtexts.objects.filter(cashTexts=request.POST['cashTexts']) を変数に変換し、それをテンプレートに渡して、それが何を返しているかを確認し、ステートメント True を伝える必要があるオブジェクトを返しました。しかし、それらを無視してとにかく提出したように見えました。

送信時に入力したものと一致する以前のオブジェクトをすべて削除できると思いますが、それにより安全性が低下し、ユーザーが何度も送信を繰り返して、より多くのものを取得していると考える可能性があります。そうなる前にやめた方がいいと思います。

4

1 に答える 1

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()、form.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 %}
于 2012-04-13T18:19:44.230 に答える