我在我的模型中使用pickelField将 csv 数据作为 pandas 数据框序列化到数据库中。Pickle 字段未显示在管理表单上,因此我创建了一个附加文本字段。
我正在关注向管理表单添加自定义字段的示例。
class ParameterDataTableAdminForm(forms.ModelForm):
# create field to accept csv text
data = forms.CharField(widget=forms.Textarea, required=True)
class Meta:
model = ParameterDataTable
def __init__(self, *args, **kwargs):
super(ParameterDataTableAdminForm, self).__init__(*args, **kwargs)
# if instance exists this is an update
if kwargs.has_key('instance'):
instance = kwargs['instance']
# repr existing data
csv_text = StringIO()
instance.values.to_csv(csv_text,index=False)
self.initial['data'] = csv_text.getvalue()
def save(self, commit=True):
model = super(ParameterDataTableAdminForm, self).save(commit=False)
# convert the data to a pandas data frame
model.values = pandas.read_csv(StringIO(self.cleaned_data['data']))
# NEED TO VALIDATE MODEL.VALUES
if commit:
model.save()
return model
class ParameterDataTableAdmin(admin.ModelAdmin):
form = ParameterDataTableAdminForm
admin.site.register(ParameterDataTable, ParameterDataTableAdmin)
问题是model.values
在 clean 方法运行后被添加到模型中。我想使用模型清理方法来验证该字段。出于显而易见的原因,我试图避免验证管理表单中的模型字段。
我已经尝试model.clean
在设置后立即显式运行,model.values
但我得到一个异常,而不是屏幕上一个干净漂亮的错误消息。
使用模型的 clean 方法验证字段value
并将其与表单字段相关联的最佳方法是什么values
?
编辑- 我正在添加我的模型的相关部分
class ParameterDataTable(ParameterBase):
values = PickledObjectField(null=False, blank=False, verbose_name=_("values"))
def clean(self):
super(ParameterDataTable, self).clean()
if self.is_visible:
raise ValidationError(_("Datatable cannot be visible"))
if pd.isnull(self.values).any().any():
raise ValidationError(_("Found missing values."))
我正在为我的模型使用 PolymorphicModel。ParameterBase
是一个多态模型。我没有遇到任何麻烦。