如何动态地向Django ModelAdmin或ModalForm添加自定义的非模型字段?

时间:2016-12-06 13:09:40

标签: django django-forms django-admin

我正在尝试在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 = ()

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

  1. 如果为Page提供了一个模板,它将从OneToOne关系中读取PageTemplate的custom_fields属性,并将其显示在Page中的给定小部件中。

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

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

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

      

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

    我该如何使这项工作?也许我的方向发展错了,所以请给我任何关于如何处理这个问题的提示。

    谢谢!

    编辑:追溯

      

    File" /venv/lib/python3.5/site-packages/django/contrib/admin/options.py"在get_form中     639. return modelform_factory(self.model,** defaults)

         

    File" /venv/lib/python3.5/site-packages/django/forms/models.py"在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)

         

    File" /venv/lib/python3.5/site-packages/django/forms/models.py"在     257.引发FieldError(消息)

         

    在处理上述异常(为Page指定的未知字段(测试))期间,发生了另一个异常:

         

    File" /venv/lib/python3.5/site-packages/django/core/handlers/base.py"在get_response中     149. response = self.process_exception_by_middleware(e,request)

         

    File" /venv/lib/python3.5/site-packages/django/core/handlers/base.py"在get_response中     147. response = wrapped_callback(request,* callback_args,** callback_kwargs)

         

    File" /venv/lib/python3.5/site-packages/django/contrib/admin/options.py"在包装中     541. return self.admin_site.admin_view(view)(* args,** kwargs)

         

    File" /venv/lib/python3.5/site-packages/django/utils/decorators.py"在_wrapped_view中     149. response = view_func(request,* args,** kwargs)

         

    File" /venv/lib/python3.5/site-packages/django/views/decorators/cache.py"在_wrapped_view_func中     57. response = view_func(request,* args,** kwargs)

         

    File" /venv/lib/python3.5/site-packages/django/contrib/admin/sites.py"在内心     244.返回视图(请求,* args,** kwargs)

         

    File" /venv/lib/python3.5/site-packages/django/contrib/admin/options.py"在change_view中     1440. return self.changeform_view(request,object_id,form_url,extra_context)

         

    File" /venv/lib/python3.5/site-packages/django/utils/decorators.py"在_wrapper中     67. return bound_func(* args,** kwargs)

         

    File" /venv/lib/python3.5/site-packages/django/utils/decorators.py"在_wrapped_view中     149. response = view_func(request,* args,** kwargs)

         

    File" /venv/lib/python3.5/site-packages/django/utils/decorators.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)

         

    File" /venv/lib/python3.5/site-packages/django/contrib/admin/options.py"在changeform_view中     1367. ModelForm = self.get_form(request,obj)

         

    File" /venv/lib/python3.5/site-packages/parler/admin.py"在get_form中     311. form_class = super(TranslatableAdmin,self).get_form(request,obj,** kwargs)

         

    File" /venv/lib/python3.5/site-packages/django/contrib/admin/options.py"在get_form中     642.%(e,self。 class 名称))

         

    异常类型:/ admin / common / page / 1 /更改/的FieldError   异常值:为页面指定的未知字段(测试)。检查字段/字段集/排除类PageAdmin的属性。

0 个答案:

没有答案