2014-10-08 2 views
1

Я пытаюсь создать тест с несколькими вопросами, которые пользователь вводит в форму (также с тегом, но здесь дело не в этом). Я пробовал следующее, но я не считаю, что это правильный подход. Я думаю, что должен быть другой способ вместо ручного вызова Quiz.objects.create() с данными, полученными из формы. Кроме того, даже если объект викторины получает создан, я получаю следующее сообщение об ошибке:Добавить данные поля поля на основе ввода пользователем

'NoneType' object has no attribute '__dict__' 

models.py

class Quiz(models.Model): 
    name = models.CharField(max_length=100) 
    number_of_questions = models.IntegerField(default=5) 
    time_limit = models.IntegerField(default=300) 
    questions = models.ManyToManyField(Question) 

forms.py

class QuizForm(forms.ModelForm): 
    class Meta: 
     model = Quiz 
     exclude = ['questions'] 

    def save(self): 
     data = self.cleaned_data 
     questions = get_questions_with_tag('example_tag') 
     questions = questions[:data['number_of_questions']] 
     quiz = Quiz.objects.create(name=data['name'], 
           time_limit=data['time_limit'], 
           number_of_questions=data['number_of_questions']) 
     for q in questions: 
      quiz.questions.add(q) 

     quiz.save() 

просмотры .py

class AddQuizView(CreateView): 
    template_name = 'quiz/cpanel/add_quiz.html' 
    form_class = QuizForm 
    success_url = reverse_lazy('list_quizzes') 

Можете ли вы предложить лучший подход, который включает только добавление списка вопросов в запрос формы?

+0

Где находятся вопросы? Что такое 'get_questions_with_tag'? –

+0

Это список объектов типа Вопрос. Я просто запрашиваю базу данных там: 'Question.objects.filter (tag__name = tag)' –

ответ

0

После еще нескольких попыток я пришел с этим:

def save(self): 
    data = self.cleaned_data 

    questions = get_questions_with_tag('example_tag') 
    questions = questions[:data['number_of_questions']] 

    self.instance.save() 
    self.instance.questions = questions 

    quiz.save() 

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