ListField的Django-nonrel表单字段

Rma*_*man 9 google-app-engine django-admin listfield django-nonrel

我正在尝试使用django-nonrelappengine并尝试使用a djangotoolbox.fields.ListField来实现多对多关系.正如我在文档中读到的那样ListField,您可以使用某种方法为djamgo-nonrel制定解决方法,而不支持多对多关系.

这是我的模型的摘录:

class MyClass(models.Model):
    field = ListField(models.ForeignKey(AnotherClass))
Run Code Online (Sandbox Code Playgroud)

因此,如果我正确地做到这一点,我将创建一个外键列表到另一个类,以显示与另一个类的多个实例的关系

通过这种方法一切正常......没有例外.我可以在代码和视图中创建`MyClass'对象.但是当我尝试使用管理界面时,我收到以下错误

No form field implemented for <class 'djangotoolbox.fields.ListField'>
Run Code Online (Sandbox Code Playgroud)

所以我虽然会尝试以前没有做过的事情.创建我自己的字段.实际上我自己的形式是MyClass在管理界面中编辑实例.这是我做的:

class MyClassForm(ModelForm):
    field = fields.MultipleChoiceField(choices=AnotherClass.objects.all(), widget=FilteredSelectMultiple("verbose_name", is_stacked=False))
    class Meta:
        model = MyClass
Run Code Online (Sandbox Code Playgroud)

然后我将MyClassForm表单传递给管理界面

class MyClassAdmin(admin.ModelAdmin):
    form = MyClassForm

admin.site.register(MyClass, MyClassAdmin)
Run Code Online (Sandbox Code Playgroud)

我虽然这会起作用,但事实并非如此.当我进入管理界面时,我得到了与以前相同的错误.谁能告诉我在做什么错在这里...或者,如果您有任何其他建议或使用的成功案例ListField,SetField等从djangotoolbox.fields在管理界面,将是非常赞赏.

Rma*_*man 11

好的,这就是我为使这一切工作而做的......我将从头开始

这就是我的模型的样子

class MyClass(models.Model):
    field = ListField(models.ForeignKey(AnotherClass))
Run Code Online (Sandbox Code Playgroud)

我希望能够使用管理界面使用列表字段的多选小部件来创建/编辑此模型的实例.因此,我创建了一些自定义类,如下所示

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
Run Code Online (Sandbox Code Playgroud)

这些类允许在管理员中使用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
Run Code Online (Sandbox Code Playgroud)

完成此操作后,我创建了一个管理模型并将其注册到管理站点

class MyClassAdmin(admin.ModelAdmin):
    form = MyClassForm

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

admin.site.register(MyClass, MyClassAdmin)
Run Code Online (Sandbox Code Playgroud)

这现在在我的代码中工作.请记住,这种方法可能根本不适合google_appengine,因为我不是很擅长它的工作原理,它可能会创建效率低下的查询.