Прежде всего, я определил представление создания для работы с набором форм:
class FormsetCreateView(CreateView):
form_class = None
template_name = None
data = None
employee = None
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.object = None
def get_context_data(self, **kwargs):
context = super(FormsetCreateView, self).get_context_data(**kwargs)
if 'form' in kwargs and kwargs['form'].errors:
context['errors'] = kwargs['form'].errors
context['employee'] = self.employee
return context
def post(self, request, *args, **kwargs):
if kwargs['formset'].is_valid():
return self.form_valid(kwargs['formset'])
else:
return self.form_invalid(kwargs['formset'])
def form_valid(self, formset):
for i in range(len(formset) - 1):
formset[i].save()
return super(FormsetCreateView, self).form_valid(formset[len(formset) - 1])
def form_invalid(self, formset):
for form in formset:
if form.errors:
return super(FormsetCreateView, self).form_invalid(form)
def get_success_url(self):
return reverse('app:evaluator_main')
def set_initial_data(self):
pass
, затем я унаследовал от моего FormsetCreateView, чтобы добавить немного дополнительного поведения:
class QualitativeEvaluationCreateView(FormsetCreateView):
form_class = QualitativeEvaluationForm
template_name = 'evaluator/ql_evaluation.html'
model_class = QualitativeEvaluationMethod
extra_model = QualitativeEvaluation
def dispatch(self, request, *args, **kwargs):
self.employee = get_object_or_404(NormalEmployee, id=int(self.kwargs['eID']))
//to get employee id from url
self.data = self.set_initial_data()
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(QualitativeEvaluationCreateView, self).get_context_data(**kwargs)
context['formset'] = QualitativeEvaluationFormset(initial=self.data)
return context
def post(self, request, *args, **kwargs):
kwargs['formset'] = QualitativeEvaluationFormset(self.request.POST, initial=self.data)
return super().post(request, *args, **kwargs)
def set_initial_data(self):
evaluation_methods = self.employee.get_unevaluated_qualitative_evaluation_methods()
return [{'evaluation_method': c, 'employee': self.employee} for c in evaluation_methods]
моя формаи formset, как показано ниже:
class QualitativeEvaluationForm(forms.ModelForm):
class Meta:
model = QualitativeEvaluation
fields = ('value', 'evaluation_method', 'employee')
widgets = {
'evaluation_method': forms.Select(attrs={'style': 'display:none;'}),
// set display to none because i will show all evaluation_methods and only get their value so evaluation_method is obvious and i don't need to ask it
'employee': forms.Select(attrs={'style': 'display:none;'}),
// set display to none because employee which we are evaluating is obvious and i don't need to ask it
}
QualitativeEvaluationFormset = formset_factory(QualitativeEvaluationForm, extra=0)