如何从Django中的表单安全地更新模型

时间:2019-02-27 04:35:06

标签: django django-forms django-templates

在我的应用中,我想提示用户回答问题。在用户看到问题之前,我已经将其存储在数据库中,其中 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>

0 个答案:

没有答案