以形式输入,然后将其与存储在 django 数据库中的值进行比较

Taking input in form and then comparing it with values stored in databse in django

我正在做一个项目,用户输入问题的答案,然后需要在单击提交按钮时检查用户输入。如果输入与存储在管理门户数据库中的答案相匹配,那么它应该将其重定向到一个新页面,否则它应该给出一个错误的错误答案。

发生的情况是,对于每个用户输入,我都被重定向到另一个页面。但即使输入的不是数据库答案中的输入,也不会显示错误答案。我该如何解决这个问题?

forms.py

from django import forms    
from .models import Answer    
from django.core.exceptions import ObjectDoesNotExist    
class CheckAnswer(forms.Form):    
    your_answer=forms.CharField(label='Answer')    
    def clean(self):    
        cleaned_data=super(CheckAnswer,self).clean()    
        response=cleaned_data.get("your_answer")    
        try:
            p = Answer.objects.filter(answer__contains=response)    
        except Answer.DoesNotExist:    
            raise forms.ValidationError("Wrong Answer")    

models.py

from django.db import models
from django.contrib.auth import get_user_model
User=get_user_model()
users=User.objects.all()
class Answer(models.Model):
    name=models.CharField(max_length=10,unique=True)
    answer=models.CharField(max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        ordering= ["-name"]

views.py

from django.shortcuts import render,redirect
from django.views.generic import *
from . import models
from django import forms
from .forms import CheckAnswer
def Arena1(request):
    if request.method=='POST':
        form = CheckAnswer(request.POST)
        if form.is_valid():
            return redirect('thanks')
    else:
        form=CheckAnswer()
    return render(request,'levels/arena1.html',{'form':form})

Model Managers filter 方法不会引发 DoesNotExist,你应该使用 Answer.objects.get(answer__contains=response) 来引发 DoesNotExist,记住这也可以 return 一个 MultipleObjectsReturned 错误,如果有多个答案与您的回答匹配,filter 将只是 return 一个空列表。

另一种选择是使用 Answer.objects.filter(answer__contains=response).exists() 并检查 return 是对还是错。