Django将额外的字段添加到从Model生成的ModelForm中

我必须从模型生成一个FormSet,但我需要插入一个“额外的价值”在每一个表单。

具体来说,我有一个JApplet在图像上生成一些标记和path,并将其张贴在服务器上。

在我的模型中,线由两个标记组成。 但是,当我POST它,因为我使用从JApplet而不是从数据库生成的ID,我不知道从哪个标记将组成一个path。

所以我想在表单上的标记上插入一个“临时ID”,并在保存path之前在视图中做正确的安排。

我想过为标记定义一个自定义表单,但是它似乎不是非常干的,如果我改变标记模型,我不想回到这个。

这里是表格:

class PointForm(forms.ModelForm): temp_id = forms.IntegerField() class Meta: model = Point def clean(self): if any(self.errors): # Don't bother validating the formset unless each form is valid on its own return ingresso = self.cleaned_data['ingresso'] ascensore = self.cleaned_data['ascensore'] scala = self.cleaned_data['scala'] if (ingresso and ascensore) or (ingresso and scala) or (ascensore and scala): raise forms.ValidationError("A stair cannot be a elevator or an access!!!") return self def save(commit=True): # do something with self.cleaned_data['temp_id'] super(PointForm).save(commit=commit) 

而模型:

  class Point(models.Model): RFID = models.CharField(max_length=200, blank=True) x = models.IntegerField() y = models.IntegerField() piano = models.ForeignKey(Floor) ingresso = models.BooleanField() 

错误:

  ViewDoesNotExist at /admin/ Could not import buildings.views.getFloors. View does not exist in module buildings.views. Request Method: GET Request URL: http://127.0.0.1:8000/admin/ Django Version: 1.4.1 Exception Type: ViewDoesNotExist Exception Value: Could not import buildings.views.getFloors. View does not exist in module buildings.views. Exception Location: /usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py in get_callable, line 101 

当我尝试加载pipe理页面时,这个错误是生成的,这个页面没有任何forms的引用。

解决例外

好吧,我会在这里写下如何找出Django为什么做这样一件奇怪的事情。

这是找出问题的正确方法。

抛出exception,因为我忘记了from django import forms添加forms.py

您可以将一个字段添加到ModelForm。 除非您将名为temp_id的字段添加到模型中,否则在更改模型时不需要更改此表单。

示例(使用名为Point的模型):

 class PointForm (forms.ModelForm): temp_id = forms.IntegerField() class Meta: model = Point def save(self, commit=True): # do something with self.cleaned_data['temp_id'] return super(PointForm, self).save(commit=commit) 

更新:在def save()中忘记自己,并将模型名称更改为Point

为了跟进relekang的回答,我不得不提醒我还要返回最后一行,以便在提交表单时自动调用对象的get_absolute_url()方法:

 return super(PointForm, self).save(commit=commit)