Reputation: 1030
I'm using CreateWithInlineView
and InlineFormset
from django-extra-views
to create a form. Let's call the main model Experiment
, Each Experiment has multiple Measurements which is basically a foreign key from Measurement
to Experiment
.
Measurement also has a foreign key to InstrumentationPoint
and the InstrumentationPoint
needs to be created before submitting the measurement inline form. So, the input form is basically a formset of Experiment modelform and Measurement modelform.
Here's a snippet from views.py
class MeasurementInline(InlineFormSet):
model = Measurement
form_class = MeasurementInlineForm
class ManualExperimentAddView(CreateWithInlinesView):
model = Experiment
form_class = ManualExperimentAddForm
inlines = [MeasurementInline]
form_title = "Add experiments"
form_id = "AddExperimentForm"
template_name = "manual_add_experiments.html"
def forms_valid(self, form,inlines):
obj = form.save(commit = False)
build = Build.objects.get(pk=self.request.GET['build'])
obj.build = build
for inline in inlines:
if isinstance(inline,MeasurementInline):
obj1 = inline.save(commit=False)
ip = inline.instance.instrumentation_point
obj1.instrumentation_point = InstrumentationPoint.objects.create(build=build, measured_node=ip)
obj1.save()
obj.save()
return super(ManualExperimentAddView, self).forms_valid(form,inlines)
and forms.py
class MeasurementInlineForm(ModelForm):
error_css_class = "error"
required_css_class = "required"
class Meta:
model = Measurement
exclude = []
instrumentation_point = forms.CharField()
class ManualExperimentAddForm(ModelForm):
error_css_class = "error"
required_css_class = "required"
class Meta:
model = Experiment
exclude = ['attachment', 'build']
date = forms.DateField(widget = DateInput())
def is_valid(self):
return True
Upon form submission, I get the following error stack trace:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/extra_views/advanced.py" in post
126. return super(BaseCreateWithInlinesView, self).post(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/extra_views/advanced.py" in post
103. if all_valid(inlines) and form_validated:
File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py" in all_valid
439. if not formset.is_valid():
File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py" in is_valid
304. self.errors
File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py" in errors
278. self.full_clean()
File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py" in full_clean
327. self._errors.append(form.errors)
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in errors
176. self.full_clean()
File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py" in full_clean
394. self._post_clean()
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in _post_clean
427. self.instance = construct_instance(self, self.instance, opts.fields, construct_instance_exclude)
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in construct_instance
62. f.save_form_data(instance, cleaned_data[f.name])
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py" in save_form_data
874. setattr(instance, self.name, data)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py" in __set__
627. self.field.rel.to._meta.object_name,
Exception Type: ValueError at /new/add_experiments/
Exception Value: Cannot assign "u'xdec'": "Measurement.instrumentation_point" must be a "InstrumentationPoint" instance.
Any help would be appreciated.
Upvotes: 3
Views: 277
Reputation: 201
in forms.py instrumentation_point field should be a InstrumentationPoint choice
instrumentation_point = forms.ModelChoiceField(
queryset=InstrumentationPoint.objects.all()
)
Upvotes: 1