django CreateView с ошибкой SuccessMessageMixin: нет атрибута 'cleaned_data' - PullRequest
0 голосов
/ 29 мая 2018

Я пытался использовать SuccessMessageMixin с CreateView, но получил ошибку.

Я использовал его с UpdateView, и он работал.

Было бы неплохо получить подсказку о том, что делать дальше,Спасибо.

Репо: https://github.com/jeremy886/DjangoBasics/blob/DjangoForms/courses/views.py

Ошибка:

AttributeError at /courses/2/create_quiz/

'Quiz' object has no attribute 'cleaned_data'

Request Method:     POST
Request URL:    http://localhost:8000/courses/2/create_quiz/
Django Version:     2.0.5
Exception Type:     AttributeError
Exception Value:    

'Quiz' object has no attribute 'cleaned_data'

Exception Location:     C:\Users\jeremy\.virtualenvs\django\lib\site-packages\django\contrib\messages\views.py in form_valid, line 12

Код:

class QuizCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
    model = "course"
    pk_url_kwarg = "course_pk"
    context_object_name = 'course'
    form_class = forms.QuizForm
    template_name = "courses/quiz_create.html"
    success_message = "%(title)s was created successfully"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        course_pk = self.kwargs.get(self.pk_url_kwarg)
        course = get_object_or_404(models.Course, pk=course_pk)
        context["course"] = course
        return context

    def form_valid(self, form):
        course_pk = self.kwargs.get(self.pk_url_kwarg)
        quiz_form = form.save(commit=False)
        quiz_form.course = get_object_or_404(models.Course, pk=course_pk)
        # find a way to add "Successfully added!" message
        return super().form_valid(quiz_form)

    def get_success_url(self):
        course_pk = self.kwargs["course_pk"]
        return reverse_lazy('courses:detail', kwargs={'pk': course_pk})
        # More: how to get the quiz id from the above quiz form

1 Ответ

0 голосов
/ 29 мая 2018

Проблема в form_valid функции: return super().form_valid(quiz_form).Это должно быть return super().form_valid(form) вместо.

def form_valid(self, form):
    course_pk = self.kwargs.get(self.pk_url_kwarg)
    form.instance.course = get_object_or_404(models.Course, pk=course_pk)
    return super().form_valid(form)
...