0

我正在尝试进入我的数据库,查看之前是否已提交过某个提交,以及是否已阻止它再次提交。目前我有这段代码测试表单的每个字段(显然每个字段都会更改,但我认为为了简单起见我只显示一个字段)

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 已经存在”。


自定义错误消息可以通过两种方式完成:1:自定义表单(我不建议这样做,除非您对 Django 的工作方式有更好的理解)2:而不是{{ field.errors }}写这样的东西:

{% if field.errors %}
     The Cashtext field {{field.name}} value should be unique.
{% endif %}
于 2012-04-13T18:19:44.230 回答