我正在尝试在Django Admin中为我的模态创建自定义字段 . 我有两个模型 - Page和PageTemplate . PageTemplate存储页面所需的所有自定义字段,并具有属性 custom_fields = JSONField(default={}) . Page与PageTemplate有一个OneToOne关系 . 页面也有 custom_fields = JSONField(default={}) . 此属性存储页面的值 . 这是我的管理员和表单签名:

class PageAdmin(TranslatableAdmin):
    form = PageForm
    fields = ['title', 'slug', 'body', 'parent', 'template', 'test']

class PageTemplateAdmin(admin.ModelAdmin):
    search_fields = ['name', 'slug']
    list_display = ['name', 'slug']
    fields = ['name', 'slug', 'custom_fields']

class PageForm(TranslatableModelForm):
    def __init__(self, *args, **kwargs):
        super(PageForm, self).__init__(*args, **kwargs)
        if 'instance' in kwargs:
            instance = kwargs['instance']
            if instance.template:
                custom_fields = instance.template.custom_fields
                                    # Add a test field so that it shows it in admin:
                self.fields['test'] = forms.DateField() 

    class Meta:
        model = Page
        exclude = ()

该系统将以下列方式工作:

  • 如果给页面一个模板,它将从OneToOne关系中读取PageTemplate的 custom_fields 属性,并在页面中显示给定的小部件 .

  • 然后只需从Page的 custom_fields 属性中获取值,并使用检索到的数据填充添加的页面模板 custom_fields .

  • 在保存之前,这些字段将根据其类型等进行所有验证 . 在保存期间,将创建一个JSON对象,它将保存到Page的 custom_fields 属性,同时忽略所有非模型字段 .

这时,我只想动态显示任何字段 . 但是我收到一个错误:

为页面指定的未知字段(测试) . 检查类PageAdmin的字段/字段集/排除属性 .

我怎样才能做到这一点?也许我已朝着错误的方向发展,所以请给我任何关于如何处理这个问题的提示 .

谢谢!

编辑:追溯

在get_form 639中输入文件“/venv/lib/python3.5/site-packages/django/contrib/admin/options.py” . 返回modelform_factory(self.model,** defaults)文件“/ venv / lib / python3 . 5 / site-packages / django / forms / models.py“in modelform_factory 545. return type(form)(class_name,(form,),form_class_attrs)File”/venv/lib/python3.5/site-packages/parler/ forms.py“在新的316. return super(TranslatableModelFormMetaclass,mcs).new(mcs,name,bases,attrs)文件”/venv/lib/python3.5/site-packages/django/forms/models.py“in提出FieldError(消息)在处理上述异常(为页面指定的未知字段(测试))期间,发生了另一个异常:文件“/venv/lib/python3.5/site-packages/django/core get_response中的/ handlers/base.py“ . get_response中的响应= self.process_exception_by_middleware(e,request)文件”/venv/lib/python3.5/site-packages/django/core/handlers/base.py“ . response = wrapped_callback(request,* callback_args,** callback_kwargs)文件“/venv/lib/python3.5/site-pack age / django / contrib / admin / options.py“在包装器541.中返回self.admin_site.admin_view(查看)(* args,** kwargs)文件”/venv/lib/python3.5/site-packages/django/在_wrapped_view_func中的utils / decorators.py“in _wrapped_view 149. response = view_func(request,* args,** kwargs)file”/venv/lib/python3.5/site-packages/django/views/decorators/cache.py“ 57. response = view_func(request,* args,** kwargs)文件“/venv/lib/python3.5/site-packages/django/contrib/admin/sites.py”在内部244.返回视图(请求,* args,** kwargs)在change_view 1440中输入文件“/venv/lib/python3.5/site-packages/django/contrib/admin/options.py” . 返回self.changeform_view(request,object_id,form_url,extra_context)文件“ _venv/lib/python3.5/site-packages/django/utils/decorators.py“在_wrapper 67中 . 返回bound_func(* args,** kwargs)文件”/venv/lib/python3.5/site-packages/ django / utils / decorators.py“in _wrapped_view 149. response = view_func(request,* args,** kwargs)File”/venv/lib/python3.5/site-packages/django/utils/decora tors.py“在bound_func 63. return func.get(self,type(self))(* args2,** kwargs2)File”/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/contextlib .py“在内部30. return func(* args,** kwds)文件”/venv/lib/python3.5/site-packages/django/contrib/admin/options.py“in changeform_view 1367.ModelForm = self . get_form(request,obj)get_form 311中的文件“/venv/lib/python3.5/site-packages/parler/admin.py”.form_class = super(TranslatableAdmin,self).get_form(request,obj,** kwargs) get_form中的文件“/venv/lib/python3.5/site-packages/django/contrib/admin/options.py” . %(e,self.class.name))异常类型:/ admin / common /中的FieldError page / 1 / change / Exception Value:为Page指定的未知字段(测试) . 检查类PageAdmin的字段/字段集/排除属性 .