Как сравнить пользовательский ввод с соответствующим полем модели django - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь создать обучающее приложение для себя, и частью моего плана является создание модуля для викторин.

Моя проблема в том, что я не знаю, как сравнить ответ пользователя с правильным ответом. это хранится в модели.

Теперь, единственное, что я пытался (кроме чтения документов и переполнения стека), это вставить вопрос о модели в мой HTML, чтобы позже использовать его в views.py, но с самого начала я чувствовал, что это не так, как должно работать, поэтому я предполагаю, что мне нужно реорганизовать свои модели / формы или внутри views.py, есть какой-то способ запросить базу данных для этого конкретного c экземпляра модели, который я надену Не знаю.

Вот мой код

Модели:

class Question(models.Model):
        question = models.CharField(max_length=100, unique=True)
        answer = models.CharField(max_length=100, unique=False)

    def __str__(self):
        return self.question

Формы:

class Answer(forms.Form):
    answer = forms.CharField()

Просмотров:

def quiz(request):
    questions = Question.objects.order_by('question')
    form = Answer()
    context_dict = {'form':form,'questions':questions}
    if request.method == 'POST':
        form = Answer(request.POST)

        if form.is_valid():
        #Here I want to make the comparison
            pass
    return render(request,"quiz_app/quiz.html",context_dict)

HTML:

<table>
        {% for q in questions %}
            <tr>
                <td>{{ q.question }}</td>       
                <form method="POST">
                    <td>{{ form.answer }}</td>
                    {% csrf_token %}
                <td>
                    <input type="submit" value="submit">
                </td>
                </form>
            </tr>
        {% endfor %}
    </table>

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Я немного обновил ваш код. Я надеюсь, что это поможет вам.

Я создал пользовательскую запись ответа для идентификационного номера каждого вопроса в HTML.

HTML:

<table>
    <form method="POST">{% csrf_token %}
        {% for q in questions %}
            <tr>
                <td>{{ q.question }}</td>
                <td><input type="text" name="answer{{q.id}}"></td>
            </tr>
        {% endfor %}
            <td>
                <input type="submit" value="submit">
            </td>
    </form>
</table>

В представлении я зафиксировал и проверил данные сообщений.

Просмотры:

def quiz(request):
    questions = Question.objects.order_by('question')
    if request.method == "POST":
        for q in questions:
            if(q.answer == request.POST.get("answer{}".format(q.id))):
                print("Success")#Do Something Here maybe redirect any page with messages
            else:
                print("Wrong")#Do Something Here maybe redirect any page with messages
    context = {
        "questions":questions
    }
    return render(request,"index.html",context)

Я не изменил ваши модели. Я не использовал формы в своем решении. Мой Engli sh слишком плох, я пытаюсь объяснить свое решение. Я надеюсь, что это поможет вам.

0 голосов
/ 07 января 2020

Вы можете передать question_id с запросом на публикацию, а затем получить экземпляр вопроса и сравнить результаты. HTML:

<form method="POST">
     <td>{{ form.answer }}</td>
      {% csrf_token %}
      <input type="hidden" name="q_id" value="{{ q.id }}" />
      <td>
          <input type="submit" value="submit">
      </td>
</form>

просмотров:

def quiz(request):
    questions = Question.objects.order_by('question')
    form = Answer()
    context_dict = {'form':form,'questions':questions}
    if request.method == 'POST':
        instance = Question.objects.get(id=request.POST['q_id'])
        form = Answer(request.POST, instance=instance)

        if form.is_valid():
        #Here I want to make the comparison
            if request.POST.get("answer").strip() == instance.answer:
                # used strip() to remove whitespace before and after the text.
                # other logic. 
    return render(request,"quiz_app/quiz.html",context_dict)
...