2012-11-22 74 views
2

這看起來像一個錯誤,但我只是想確保我正確使用API​​。如何在neo4django中使用ModelForm?

neo4django不支持django的模型。下面是我有:

簡單類:

從neo4django.db進口車型

類Person(models.NodeModel): 名= models.StringProperty()

模型形式:

class PersonForm(forms.ModelForm): 類元: 模型=人

會引發異常:

'超級' 對象有沒有屬性 '編輯'

我發佈的信息爲一個問題: https://github.com/scholrly/neo4django/issues/135

因爲當Django使用模型的_meta的信息來查找字段信息它找到了一個BoundProperty而不是一個StringProperty或Property(它有一個名爲'editable'的成員,但BoundProperty沒有)。

是否有解決方法,或者這是一個實際的錯誤?任何想法如何解決這個錯誤?我不熟悉庫代碼庫。

謝謝!

回答

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參數會給你th與django的modelform類相同的解決方案 - 但我沒有打算實現save_m2m功能(這與neo4j作爲後端似乎不相關)。

+0

對於那些還沒有看到的,現在官方支持ModelForms - https://github.com/scholrly/neo4django/issues/135 –

相關問題