Django:表单提交URL的ValueError

时间:2015-05-28 09:55:12

标签: python django

我使用CreateWithInlineView中的InlineFormsetdjango-extra-views来创建表单。让我们调用主模型Experiment,每个实验都有多个测量,基本上是从MeasurementExperiment的外键。

测量还有InstrumentationPoint的外键,并且在提交测量内联表单之前需要创建InstrumentationPoint。因此,输入表格基本上是实验模型和测量模型的形式。

这是来自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)

和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

提交表单后,我收到以下错误堆栈跟踪:

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.

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

forms.py instrumentation_point字段中的

应该是InstrumentationPoint选择

instrumentation_point = forms.ModelChoiceField(
                                  queryset=InstrumentationPoint.objects.all()
                                              )