如何将ModelForm与neo4django一起使用?

时间:2012-11-22 00:17:23

标签: django neo4j neo4django

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

似乎neo4django不支持django的modelform支持。这就是我所拥有的:

简单的课程:

  

来自neo4django.db导入模型

     

class Person(models.NodeModel):       name = models.StringProperty()

模型形式:

  

class PersonForm(forms.ModelForm):       类Meta:           model = Person

会触发异常:

  

'super'对象没有属性'editable'

我发布了详细信息: https://github.com/scholrly/neo4django/issues/135

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

以下是使用neo4j和Django的任何人的合理(和快速)解决方法。

此解决方案要求表单上的字段名称与模型的属性具有完全相同的名称

从此类继承表单并在表单类Meta class:

下设置模型
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作为后端无关)。