def form_valid(self, form): """ Save form, and perhaps dosing regime and dosing groups, if appropriate. If an animal group is NOT generational, then it requires its own dosing regime. Thus, we must make sure the dosing regime is valid before attempting to save. If an animal group IS generational, a dosing-regime can be specified from parent groups. OR, a dosing-regime can be created. """ self.object = form.save(commit=False) # If a dosing-regime is already specified, save as normal if self.is_generational and self.object.dosing_regime: return super().form_valid(form) # Otherwise we create a new dosing-regime, as well as the associated # dose-groups using a formset. self.form_dosing_regime = forms.DosingRegimeForm(self.request.POST) if self.form_dosing_regime.is_valid(): dosing_regime = self.form_dosing_regime.save(commit=False) # unpack dose-groups into formset and validate # occasionally POST['dose_groups_json'] will be '', which json.loads # will raise an error on. Replace with '{}' on those occasions. dose_groups = self.request.POST['dose_groups_json'] dose_groups_json = dose_groups if dose_groups != '' else '{}' fs_initial = json.loads(dose_groups_json) fs = forms.dosegroup_formset_factory(fs_initial, dosing_regime.num_dose_groups) if fs.is_valid(): # save dosing-regime and associate animal-group, # setting foreign-key interrelationships dosing_regime.save() self.object.dosing_regime = dosing_regime self.object.save() dosing_regime.dosed_animals = self.object dosing_regime.save() # now save dose-groups, one for each dosing regime for dose in fs.forms: dose.instance.dose_regime = dosing_regime fs.save() return super().form_valid(form) else: # invalid formset; extract formset errors lis = [] for f in fs.forms: if len(list(f.errors.keys())) > 0: lis.extend(form_error_list_to_lis(f)) if len(fs._non_form_errors) > 0: lis.extend(fs._non_form_errors) self.dose_groups_errors = form_error_lis_to_ul(lis) return self.form_invalid(form) else: # invalid dosing-regime return self.form_invalid(form)
def form_valid(self, form): """ If the dosing-regime is valid, then check if the formset is valid. If it is, then continue saving. """ self.object = form.save(commit=False) # unpack dose-groups into formset and validate fs_initial = json.loads(self.request.POST['dose_groups_json']) fs = forms.dosegroup_formset_factory(fs_initial, self.object.num_dose_groups) if fs.is_valid(): self.object.save() # instead of checking existing vs. new, just delete all old # dose-groups, and save new formset models.DoseGroup.objects.filter(dose_regime=self.object).delete() # now save dose-groups, one for each dosing regime for dose in fs.forms: dose.instance.dose_regime = self.object fs.save() return super(DosingRegimeUpdate, self).form_valid(form) else: # invalid formset; extract formset errors lis = [] for f in fs.forms: if len(f.errors.keys()) > 0: lis.extend(form_error_list_to_lis(f)) if len(fs._non_form_errors) > 0: lis.extend(fs._non_form_errors) self.dose_groups_errors = form_error_lis_to_ul(lis) return self.form_invalid(form)