2

这似乎是一个错误,但我只是想确保我正确使用 API。

neo4django 似乎不支持对 django 的模型形式的支持。这是我所拥有的:

简单类:

从 neo4django.db 导入模型

类人(models.NodeModel):名称=models.StringProperty()

模型形式:

类 PersonForm(forms.ModelForm): 类 Meta: 模型 = 人

会触发异常:

“超级”对象没有“可编辑”属性

我将详细信息发布为问题: https ://github.com/scholrly/neo4django/issues/135

因为当 Django 使用模型的 _meta 信息查找字段信息时,它会找到一个 BoundProperty 而不是 StringProperty 或 Property(它有一个名为 'editable' 的成员,但 BoundProperty 没有)。

是否有解决方法,或者这是一个实际的错误?关于如何修复错误的任何想法?我不熟悉库代码库。

谢谢!

4

1 回答 1

2

对于任何使用 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 无关)。

于 2012-11-22T03:27:48.367 回答