2017-01-06 5 views
0

У меня есть приложение, которое показывает некоторые вопросы пользователю. Он должен отвечать во входных текстовых полях, а затем есть представление, которое проверяет все эти результаты (ниже).Как я могу упростить это представление Django?

Этот вид отлично работает, но я знаю, что я сделал беспорядок со словарями и списками. Я думал создать их только для того, чтобы подготовить переменную результатов, которую я буду печатать на HTML-странице. Как я могу это упростить?

def check(request): 
    # Initialize results 
    results = [] 

    i = 0 
    for input_name, input_value in request.POST.items(): 

     # Remove cfsr from inputs 
     if input_name.isdigit(): 

      # Get the question from the input name 
      question = Question.objects.get(pk=input_name) 

      # Get the related correct answer to that question 
      answer = question.answer 

      # Create results 
      results.append({'question_text': question.text, 'user_answer': input_value, 
          'correct_answer': answer.text}) 

      # Check if user answer is correct 
      if input_value == answer.text: 
       results[i]['is_correct'] = True 
      else: 
       results[i]['is_correct'] = False 

      i += 1 

    context = {'results': results} 
    return render(request, 'quiz/results.html', context) 
+0

Вы должны попытаться использовать формы для создания викторины и проверить ответы. – hop

ответ

3

Вы могли бы сделать эти улучшения для удобства чтения:

  1. Создать список ресурсов, которые вы хотите получить доступ; проверка if для поля csrf_token делает код более трудным для чтения, и предположение, что csrf_token всегда содержит буквы, может быть неверным. (i); счетчики, подобные этому в for, петли не являются питонами и часто просто усложняют код.

  2. Замените тест if/else на правильный ответ с помощью булевого выражения; вы всегда можете это сделать с помощью блоков if/else, которые просто присваивают True или False переменной в зависимости от результата какого-либо теста.
  3. Создайте свой словарь результатов целиком перед добавлением в список, чтобы избежать доступа через его индекс (results[i]...).

    from django.http import HttpResponseNotAllowed, HttpResponseBadRequest 
    
    def check(request): 
        if not request.method == 'POST': 
         return HttpResponseNotAllowed(['POST']) 
    
        # guaranteed by CsrfViewMiddleware to exist 
        del request.POST['csrfmiddlewaretoken'] 
    
        results = [] 
        for question_id, user_answer in request.POST.items(): 
         try: 
          question = Question.objects.get(pk=name) 
         except Question.DoesNotExist: 
          return HttpResponseBadRequest("Oops!") 
    
         results.append({ 
          'question_text': question.text, 
          'user_answer': user_answer, 
          'correct_answer': question.answer.text, 
          'is_correct': value == question.answer.text, 
         }) 
    
        return render(request, 'quiz/results.html', { 
         'results': results, 
        }) 
    
+0

Это не может быть правильно ... откуда берется поле? – hop

+0

@hop Да, есть только эта проблема для этого ответа. Спасибо вам все равно –

+0

Я думаю, что ваше использование 'request.POST.items' также неверно в обоих случаях. – hop

2

Вы можете заменить

if input_value == answer.text: 
    results[i]['is_correct'] = True 
else: 
    results[i]['is_correct'] = False 

с

results[-1]['is_correct'] = input_value == answer.text 

и избавиться от i

или даже лучше, вы могли бы положить, что в results.append

results.append({'question_text': question.text, 
       'user_answer': input_value, 
       'correct_answer': answer.text, 
       'is_correct': input_value == answer.text})