我正在Appengine上试验django-nonrel,并尝试使用djangotoolbox.fields.ListField实现多对多关系。正如我在文档中所读到的那样,可以使用ListField来解决djamgo-nonrel不支持多对多关系的问题。

这是我的模型的摘录:

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

因此,如果我做对了,我将创建另一个类的外键列表,以显示与另一个类的多个实例的关系

使用这种方法,一切都可以正常工作。我可以在代码和 View 中创建“MyClass”对象。但是,当我尝试使用管理界面时,出现以下错误
No form field implemented for <class 'djangotoolbox.fields.ListField'>

因此,尽管我会尝试一些以前没有做过的事情。创建我自己的字段。好吧,实际上是我自己的表单,用于在管理界面中编辑MyClass实例。这是我所做的:
class MyClassForm(ModelForm):
    field = fields.MultipleChoiceField(choices=AnotherClass.objects.all(), widget=FilteredSelectMultiple("verbose_name", is_stacked=False))
    class Meta:
        model = MyClass

然后我将MyClassForm作为要使用的表单传递给管理界面
class MyClassAdmin(admin.ModelAdmin):
    form = MyClassForm

admin.site.register(MyClass, MyClassAdmin)

我虽然这行得通,但事实并非如此。当我进入管理界面时,会收到与以前相同的错误。任何人都可以在这里告诉我我在做什么错...或者如果您在管理界面中从ListField使用SetFielddjangotoolbox.fields等有任何其他建议或成功案例,将不胜感激。

最佳答案

好的,这就是我要做的所有工作...
我将从头开始

这就是我的模型的样子

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

我希望能够使用管理界面,通过为列表字段使用多个选择小部件来创建/编辑此模型的实例。因此,我创建了一些自定义类,如下所示
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

这些类允许在管理员中使用listfield。然后,我创建了一个要在管理站点中使用的表单
class MyClassForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyClasstForm,self).__init__(*args, **kwargs)
        self.fields['field'].widget.choices = [(i.pk, i) for i in AnotherClass.objects.all()]
        if self.instance.pk:
            self.fields['field'].initial = self.instance.field

    class Meta:
        model = MyClass

完成此操作后,我创建了一个管理模型并将其注册到管理站点
class MyClassAdmin(admin.ModelAdmin):
    form = MyClassForm

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

admin.site.register(MyClass, MyClassAdmin)

现在,这在我的代码中起作用。请记住,这种方法可能根本不适合google_appengine,因为我不太擅长如何使用它,并且可能会产生效率低下的查询。

09-27 20:30