В моем приложении я хочу предложить пользователю ответить на вопрос.Прежде чем пользователь увидит вопрос, я уже храню его в своей базе данных, где поле 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>