Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>here's a complete forms.py you can base your code on</p> <pre><code>from django import forms from django.forms.formsets import DELETION_FIELD_NAME from django.forms.models import BaseInlineFormSet, BaseModelFormSet, inlineformset_factory from .models import Disease, Indicator, IndicatorValue class BaseIndicatorFormSet(BaseInlineFormSet): def save_new(self, form, commit=True): instance = super(BaseIndicatorFormSet, self).save_new(form, commit=commit) form.instance = instance for nested in form.nested: nested.instance = instance for cd in nested.cleaned_data: cd[nested.fk.name]=instance return instance def add_fields(self, form, index): super(BaseIndicatorFormSet, self).add_fields(form, index) try: instance = self.get_queryset()[index] pk_value = instance.pk except IndexError: instance=None pk_value = hash(form.prefix) form.nested = [ IndicatorValueFormSet( instance=instance, disease=instance.relevantdisease, prefix='value_%s' % pk_value, queryset=IndicatorValue.objects.filter(relevantindicator=pk_value), ) ] def should_delete(self, form): """ Convenience method for determining if the form's object will be deleted; cribbed from BaseModelFormSet.save_existing_objects. """ if self.can_delete: raw_delete_value = form._raw_value(DELETION_FIELD_NAME) should_delete = form.fields[DELETION_FIELD_NAME].clean(raw_delete_value) return should_delete return False def save_all(self, commit=True): """ Save all formsets and along with their nested formsets. """ # Save without committing (so self.saved_forms is populated) # - We need self.saved_forms so we can go back and access # the nested formsets objects = self.save(commit=False) # Save each instance if commit=True if commit: for o in objects: o.save() # save many to many fields if needed if not commit: self.save_m2m() # save the nested formsets for form in set(self.initial_forms + self.saved_forms): if self.should_delete(form): continue for nested in form.nested: nested.save(commit=commit) class BaseIndicatorValueFormSet(BaseInlineFormSet): def __init__(self, disease, *args, **kwargs): self.disease = disease super(BaseIndicatorValueFormSet, self).__init__(*args, **kwargs) def _construct_form(self, i, **kwargs): form = super(BaseIndicatorValueFormSet, self)._construct_form(i, **kwargs) form.fields['relevantindicator'].parent_instance = self.disease return form def save_new(self, form, commit=True): instance = form.save(commit=False) instance.disease = self.disease if commit: instance.save() return instance def save_existing(self, form, instance, commit=True): return self.save_new(form, commit) IndicatorValueFormSet = inlineformset_factory( Indicator, IndicatorValue, formset=BaseIndicatorValueFormSet, extra=3 ) IndicatorFormSet = inlineformset_factory( Disease, Indicator, formset=BaseIndicatorFormSet, extra=0 ) </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload