对于任何使用 Django 的 neo4j 的人,以下是一个合理(且快速)的解决方法。
此解决方案要求表单上的字段名称与模型的属性名称完全相同。
从该类继承表单,并将模型设置在表单类 Meta 类下:
class NeoModelForm(forms.Form):
def __init__(self, *args, **kwargs):
super(NeoModelForm, self).__init__(*args, **kwargs)
self._meta = getattr(self, 'Meta', None)
if not self._meta:
raise Exception('Missing Meta class on %s' % str(self.__class__.__name__))
if not hasattr(self._meta, 'model'):
raise Exception('Missing model on Meta class of %s' % str(self.__class__.__name__))
def save(self, commit=True):
if not self.is_valid():
raise Exception('Failed to validate')
instance = self._meta.model(**self.cleaned_data)
if commit:
instance.save()
return instance
现在您可以像这样创建一个表单类:
class PersonForm(NeoModelForm):
name = forms.CharField(widget=forms.TextInput())
class Meta:
model = Person
并且仍然能够从有效表单中保存模型实例:
form = formclass(request.POST)
if form.is_valid():
obj = form.save()
另外,commit 参数将为您提供与 django 的 modelform 类相同的解决方案——但我没有费心去实现 save_m2m 功能(这似乎与作为后端的 neo4j 无关)。