2011-10-16 60 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 - 可能不受支持的类型”! –