Не добавляется новый объект через форму Django

Рейтинг: 0Ответов: 0Опубликовано: 08.04.2023

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

view.py:

from django.shortcuts import redirect, get_object_or_404
from .models import Test, Question, Answer
from .forms import QuestionForm, AnswerForm, QuestionSetForm, QuestionFormset
from django.views.generic import CreateView, UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy, reverse
from django.forms.formsets import formset_factory


class QuestionsAddView(LoginRequiredMixin, CreateView):
    question_form_class = QuestionForm
    answer_form_class = AnswerForm
    template_name = 'tests/questions_add.html'

    def get_object(self):
        id_test = self.kwargs['id_test']
        test = Test.objects.filter(pk = self.kwargs['id_test']).first()
        question = Question.objects.all().last().id+1

        return question

    def count(self):
        return Test.objects.filter(pk = self.kwargs['id_test']).first().questions_count

    def get_formset(self, form):
        return formset_factory(form)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['id_test'] = self.kwargs['id_test']
        context['test'] = Test.objects.filter(pk = self.kwargs['id_test']).first()
        context['question_form'] = self.question_form_class
        context['answer_form'] = self.answer_form_class

        return context

    def form_question_valid(self, form_question, form_answer):
        num_q = 0
        y = 0
        z = 0

        for f in form_question:
            num_q+=1
            self.object = f.save(commit = False)
            self.object.test = Test.objects.filter(pk = self.kwargs['id_test']).first()
            self.object.num = num_q
            f.save()        
            count = self.object.answer_count
            num_a = 0

            for z in range(count):
                num_a += 1
                print(count)
                self.object = form_answer[y].save(commit = False)               
                self.object.question = Question.objects.all().last()
                self.object.num = num_a
                form_answer[y].save()
                y += 1

        return form_question, form_answer

    def get(self, request, *args, **kwargs):
        self.object = None  
        
        FormsetQuestion = self.get_formset(QuestionForm)
        FormsetAnswer = self.get_formset(AnswerForm)
        form = FormsetQuestion(prefix = 'question')
        formset = FormsetAnswer(prefix = 'answer')
    
        return self.render_to_response(
                    self.get_context_data(form=form, formset = formset))

    def post(self, request, *args, **kwargs):
        self.object = None
        FormsetQuestion = self.get_formset(QuestionForm)
        FormsetAnswer = self.get_formset(AnswerForm)
        form = FormsetQuestion(request.POST, prefix = 'question')
        formset = FormsetAnswer(request.POST, prefix = 'answer')
            
        if self.form_question_valid(form, formset): 
            print("fff")            
            return redirect('test_update', self.kwargs['id_test'])
        else:
            return redirect('error')

    def get_success_url(self):      
        return reverse_lazy('test_update', args = [self.kwargs['id_test']])

forms.py:

from django import forms
from .models import Question, Answer
from django.forms import ModelForm


class QuestionForm(ModelForm):
    class Meta:
        model = Question
        fields = '__all__'

        widgets = {
            'test': forms.Select(attrs={'class': 'form-control', 'rows': 5}),
            'text': forms.Textarea(attrs={'class': 'form-control'}),
            'weight': forms.NumberInput(attrs={'class': 'form-control'}),
            'num': forms.NumberInput(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super(QuestionForm, self).__init__(*args, **kwargs)


class AnswerForm(ModelForm):
    class Meta:
        model = Answer
        fields = '__all__'

        widgets = {
            'question': forms.Select(attrs={'class': 'form-control', 'rows': 5}),
            'text_answer': forms.Textarea(attrs={'class': 'form-control'}),
            'is_right': forms.CheckboxInput(),
            'num': forms.NumberInput(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super(AnswerForm, self).__init__(*args, **kwargs)

urls.py:

from django.urls import path
from . import views


urlpatterns = [
    path('tests/<int:id_test>/question_add/<int:id_question>/', views.QuestionAddView.as_view(), name='question_add'),
]

html:

<form method="POST">
    {% csrf_token %}
    {{ question_form }}
    <input type="submit" value="Send" >
</form>
<form method="POST">
    {% csrf_token %}
    {{ answer_form }}
    <input type="submit" value="Send" >
</form>

Ответы

Ответов пока нет.