2

これはバグのようですが、API を適切に使用していることを確認したいだけです。

django の modelform のサポートは、neo4django ではサポートされていないようです。ここに私が持っているものがあります:

単純なクラス:

neo4django.db インポート モデルから

クラス Person(models.NodeModel): 名前 = models.StringProperty()

モデルフォーム:

クラス PersonForm(forms.ModelForm): クラス メタ: モデル = Person

例外をトリガーします:

「スーパー」オブジェクトには「編集可能」属性がありません

問題として詳細を投稿しました: https://github.com/scholrly/neo4django/issues/135

Django がモデルの _meta 情報を使用してフィールド情報を検索すると、StringProperty または Property の代わりに BoundProperty が検出されるためです (これには「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 のモデルフォーム クラスと同じソリューションが得られますが、save_m2m 機能を実装する必要はありませんでした (バックエンドとしての neo4j には関係ないようです)。

于 2012-11-22T03:27:48.367 に答える