Обзор: я хочу создать веб-сайт «Вопрос-ответ», на котором пользователь должен вводить правильный ответ на каждый вопрос. Для этого я сделал 3 модели:
class ProblemSet(models.Model):
id = models.IntegerField(primary_key=True)
class Problem(models.Model):
id = models.IntegerField(primary_key=True)
problem_set = models.ForeignKey(ProblemSet, on_delete=models.CASCADE)
question = models.TextField()
solution = models.TextField()
class Solve(models.Model):
username = models.ForeignKey(User, on_delete=models.CASCADE)
problem_set = models.ForeignKey(ProblemSet, on_delete=models.CASCADE)
problem_id = models.ForeignKey(Problem, on_delete= models.CASCADE)
В модели решения, если есть какая-либо запись, означающая, что конкретный пользователь решил эту проблему. Итак, я использовал обобщенный c Просмотр формы:
class IndexView(FormView):
form_class = ProblemForm
template_name = 'home/index.html'
success_url = reverse_lazy('index')
def get_context_data(self, **kwargs):
context = super(IndexView, self).get_context_data(**kwargs)
if self.request.user.is_authenticated:
inner_qs = "fetch ids that are solved from Solve model"
problem_obj = Problem.objects\
.exclude(id__in=inner_qs)\
.order_by('id').first()
else:
#do something
context['question'] = problem_obj.question
return context
Форма проблемы:
from django import forms
class ProblemForm(forms.Form):
solution = forms.CharField(widget=forms.TextInput())
Как мне проверить, что пользователь вводит правильный ответ? Я получаю значение поля solution в функции def form_valid (self, form), но как мне с этим бороться? Должен ли я передать question_id в контексте и запросить базу данных в form_valid, или я должен передать само решение для контекста и получить доступ к данным контекста в методе form_valid (), чтобы предотвратить двойной запрос, но в этом методе я не уверен, насколько это безопасно, поскольку я не Я не хочу, чтобы решение передавалось клиенту.
Есть ли какой-нибудь элегантный способ сделать это?
PS После того, как введенное пользователем решение сравнивается с данным в базе данных для этого вопроса, я добавляю запись в таблицу Solve, обозначающую, что этот конкретный пользователь решил вопрос id.