Как безопасно обновить модель из формы в Django - PullRequest
0 голосов
/ 27 февраля 2019

В моем приложении я хочу предложить пользователю ответить на вопрос.Прежде чем пользователь увидит вопрос, я уже храню его в своей базе данных, где поле user_answer равно нулю.Когда пользователь хочет ответить на вопрос, в шаблоне появится форма, а затем предоставленный ответ будет обновлен в модели.

Код ниже делает это.Тем не менее, в настоящее время я внедряю question_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>
...