我正在尝试在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 = ()
该系统将以下列方式工作:
如果为Page提供了一个模板,它将从OneToOne关系中读取PageTemplate的custom_fields
属性,并将其显示在Page中的给定小部件中。
然后只需获取Page的custom_fields
属性中的值,并使用检索到的数据填充添加的页面模板custom_fields
。
在保存之前,这些字段将根据其类型等进行所有验证。在保存期间,将创建一个JSON对象,它将被保存到Page的custom_fields
属性而忽略所有非模型字段。
此时,我只想动态显示任何字段。但是我收到了一个错误:
为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的属性。