2013-03-25 5 views
1

Я пытаюсь принять викторину, и если вы ответите на неправильный вопрос, вы увидите, что этот вопрос добавляется в список неправильных вопросов.Динамический просмотр не отображается

Вопросы могут быть использованы в нескольких викторинах, так что я не могу жесткий код спросить question_1 затем question_2 и т.д.

Когда я загрузить страницу, я вижу первый вопрос, но если я представить или обновить я вижу право. html-шаблон. Он не задает все вопросы.

Он должен задать все вопросы перед визуализацией страницы right.html

for question in quiz.questions.all(): 
    if question not in asked_questions: 
     asked_questions.append(question) 
     return answer_question(request, quiz_id, question.id, module_list) 

models.py

class Choice(models.Model): 
    choice = models.CharField(max_length=64) 
    def __unicode__(self): 
     return self.choice 

#create a multiple choice quiz to start 
class Question(models.Model): 
    question = models.CharField(max_length=64) 
    answer = models.CharField(max_length=64) 
    choices = models.ManyToManyField(Choice) 
    module = models.CharField(max_length=64) 

    def __unicode__(self): 
     return self.question 

class Quiz(models.Model): 
    name = models.CharField(max_length=64) 
    questions = models.ManyToManyField(Question) 

    def __unicode__(self): 
     return self.name 

views.py

asked_questions = [] 
module_list = [] 
module_list.append('test') 

def take_quiz(request, quiz_id): 
    quiz = Quiz.objects.get(id=str(quiz_id)) 

    for question in quiz.questions.all(): 
     if question not in asked_questions: 
      asked_questions.append(question) 
      return answer_question(request, quiz_id, question.id, module_list) 
    #quiz is over 
    return render (request, 'right.html') 

def answer_question(request, quiz_id, question_id, module_list): 
    question = Question.objects.get(id=question_id) 
    #module_list = [] 
    if request.method == 'POST': 
     form = QuestionForm(request.POST) 
     choices = [(i, i) for i in question.choices.all()] 
     form.fields['selection'].choices = choices 

     if form.is_valid(): 
      if form.cleaned_data['selection'] != str(question.answer): 
       module_list.append(question.module) 
      return take_quiz(request, quiz_id) 
    else: 
     form = QuestionForm() 
     choices = [(i, i) for i in question.choices.all()] 
     form.fields['selection'].choices = choices 

    return render(request, 'answer_question.html', {'question':question, 'form':form, 'module_list':module_list}) 
+0

Можете ли вы поделиться right.html содержание? –

+0

Он содержит «право», так что я знаю, что я проделал викторину. – Siecje

ответ

0

Если вы планируете на хостинг это и сделать его доступным в Интернете, вы действительно должны начать все заново. Вы не должны использовать такие списки, чтобы хранить вещи, вместо этого вы должны использовать sessions или cache. Кроме того, вам было бы лучше использовать FormWizard для викторины, поскольку он предназначен для того, чтобы делать именно то, что вы пытаетесь сделать: обрабатывать несколько форм и обрабатывать их.

+0

Я смотрю FormWizard, и мне интересно. Как вы устанавливаете выбор для поля формы? Как вы используете одно и то же многократное, но динамическое время. Очевидно, вы не можете использовать ajax с FormWizard, это все еще так? – Siecje

+0

@Siecje Итак, FormWizard имеет некоторые методы, которые вы можете переопределить, чтобы установить такие вещи. Вероятно, вам понадобится ['get_form'] (https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#django.contrib.formtools.wizard.views.WizardView.get_form) метод. Что касается использования одной и той же формы несколько раз, вы можете просто динамически создать список, содержащий копии формы для перехода к представлению. Я не уверен в ajax, возможно, вы можете создать шаблон, который будет использовать ajax, я не могу думать ни о чем, что помешало бы вам сделать это на данный момент. – Ngenator

0

Может быть, вы должны попробовать

return HttpResponseRedirect(reverse('answer_question', args=[quiz_id, question_id, module_list])) 

перенаправить ваш взгляд на другой вид.

p.s .: реверс должен содержать название вашей точки зрения «answer_question»

+0

И я согласен с Ngenator в сеансах или кеше. – Erika

+0

Обратный для 'answer_question' с аргументами '(u'1', 1, ['test']) 'и аргументы ключевого слова' {} 'не найдены. – Siecje

+0

Как я уже сказал, «answer_question» следует заменить на имя, которое у вас есть в вашем urls.py, что приводит к этому представлению. – Erika

Смежные вопросы