2011-10-16 57 views
1

我想在mongodb上實現django-nonrel中的manytomany字段關係。它是在suggessted到:Django-Nonrel與Mongodb listfield

Django-nonrel form field for ListField

繼接受的答案

models.py

class MyClass(models.Model): 
    field = ListField(models.ForeignKey(AnotherClass)) 

我不知道在哪裏下面去,它已經在fields.py測試,widgets,py,models.py

class ModelListField(ListField): 
    def formfield(self, **kwargs): 
    return FormListField(**kwargs) 

class ListFieldWidget(SelectMultiple): 
    pass 

class FormListField(MultipleChoiceField): 
    """ 
    This is a custom form field that can display a ModelListField as a Multiple Select GUI element. 
    """ 
    widget = ListFieldWidget 

    def clean(self, value): 
    #TODO: clean your data in whatever way is correct in your case and return cleaned data instead of just the value 
    return value 

admin.py

class MyClassAdmin(admin.ModelAdmin): 
    form = MyClassForm 

    def __init__(self, model, admin_site): 
    super(MyClassAdmin,self).__init__(model, admin_site) 

admin.site.register(MyClass, MyClassAdmin) 

以下錯誤不斷彈出:

如果中間自定義類代碼在models.py使用

name 'SelectMultiple' is not defined 

如果自定義類別代碼被帶下models.py:

No form field implemented for <class 'djangotoolbox.fields.ListField'> 

回答

0

你只需要通過它的聲音導入SelectMultiple。你可以把這些代碼放在這三個文件中的任何一箇中,fields.py是有意義的。

因爲它是非常常用的有:

from django import forms 

在你的文件的頂部已經,你可能只是想編輯下面的代碼:

# you'll have to work out how to import the Mongo ListField for yourself :) 
class ModelListField(ListField): 
    def formfield(self, **kwargs): 
    return FormListField(**kwargs) 

class ListFieldWidget(forms.SelectMultiple): 
    pass 

class FormListField(forms.MultipleChoiceField): 
    """ 
    This is a custom form field that can display a ModelListField as a Multiple Select GUI element. 
    """ 
    widget = ListFieldWidget 

    def clean(self, value): 
    #TODO: clean your data in whatever way is correct in your case and return cleaned data instead of just the value 
    return value 

你可能也想試試並學習更多關於Python如何工作,如何導入模塊等。

+0

當我使用這種方法來定義自定義模型字段時,那麼對應於模型生成的表不包含'cus湯姆場「。而且我在呈現時遇到了'Caught DatabaseError'異常:無此列:MyTable.MyCustomField'。我錯過了什麼嗎? –

+0

由於類型'ListField',找出它的忽略。如果我重寫函數get_internal_type並返回textField等,那麼它不會被忽略。不知道爲什麼ListField不工作。 –

+0

必須重寫db_type並提供ListField作爲返回類型。 ListField沒有在我使用的後端的數據類型中定義,所以db_type返回None並且Django跳過該字段。當試圖保存表單時,現在停留在ListField的「接口錯誤:錯誤綁定參數4 - 可能不受支持的類型」! –