在我的应用中,我想提示用户回答问题。在用户看到问题之前,我已经将其存储在数据库中,其中 user_answer 字段为空。当用户想要回答问题时,模板中会弹出一个表格,然后提供的答案将在模型中更新。
下面的代码执行此操作。但是,我目前正在将question_id作为表单内的隐藏字段注入。我怀疑这不是最佳做法,因为攻击者可能会篡改该字段,攻击者可能会更改ID,并可能使我修改模型中的其他问题。如何以安全可靠的方式将模板表单中的question_id字段传回模型?
这是我的模特
class Question(models.Model):
question = models.CharField(max_length=50)
user_answer = models.CharField(max_length=50, null=True)
is_correct = models.BooleanField(null=True)
我的表单:
class QuestionForm(forms.Form):
question_id = forms.IntegerField()
user_answer = forms.CharField(max_length=100)
我的观点:
def question(request, question_id):
if request.method == 'POST':
form = QuestionForm(request.POST)
if form.is_valid():
q = Question.objects.get(id=form.cleaned_data['question_id'])
q.user_answer = form.cleaned_data['user_answer']
q.save()
return render(request, 'done.html', {'form':form.cleaned_data})
else:
return render(request, 'home.html')
else:
question = get_list_or_404(Question, id=question_id)
form = QuestionForm({'question_id':question.id})
return render(request, 'quiz.html', {'question':question, 'form':form})
以及模板中的表单:
<form method="POST" action="{% url 'question' question.id %}">
{% csrf_token %}
{{ form.question_id.as_hidden }}
{{ question.question }}
<br>
{{ form.user_answer }}
<br>
<button type="submit" class="btn btn-primary">Submit</button>
</form>