Не добавляется новый объект через форму Django
Пытаюсь создать новый объект через форму, но не загружается, через админку получается, а через сайт нет.
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>
Источник: Stack Overflow на русском