使用Camelot框架,模型(从实体子类)定义为嵌套类(来自EntityAdmin的子类),该嵌套类定义了各种gui属性,如布局和其他小部件。文档指示可以定义多个实体管理员,然后由调用模型指定:
管理
对于关系字段,指定要用于可视化关系另一端的 admin 类。默认为目标类的默认管理员类。这可用于使 one2many 小部件中的表视图看起来与同一对象的默认表视图不同。 柯莱特:字段属性手册页
我似乎无法弄清楚所需的语法。作为案例研究,任何人都可以帮助我弄清楚如何使用包装中的"卡米洛特示例"来做到这一点?(Camelot 13.04.13, Python 2.7.6)
这是我的示例代码:
from sqlalchemy.schema import Column
from sqlalchemy.types import Unicode, Integer
from camelot.admin.entity_admin import EntityAdmin
from camelot.core.orm import Entity, ManyToOne, OneToMany
import camelot.types
class Company(Entity):
__tablename__ = 'company'
name = Column(Unicode())
city = Column(Unicode())
employees = OneToMany('Employee')
def __unicode__(self):
return self.name or ''
class Admin(EntityAdmin):
verbose_name = 'Company'
verbose_name_plural = 'Companies'
list_display = ['name', 'city', 'employees']
field_attributes = {'employees': {'create_inline': True},
'admin': 'AlternativeAdmin'}
class Employee(Entity):
__tablename__ = "employee"
name = Column(Unicode())
age = Column(Integer())
company = ManyToOne('Company')
def __unicode__(self):
return self.name or ''
class Admin(EntityAdmin):
verbose_name = 'Employee'
list_display = ['name', 'age', 'company']
class AlternativeAdmin(EntityAdmin):
verbose_name = 'Employee'
list_display = ['name']
注意:
- Company.Admin.field_attributes下的"管理员"
- "替代管理员"类
此代码运行没有错误,但它不能按预期工作。公司窗体显示显示姓名、年龄和公司的员工子窗体。它应该只是显示公司。我已经为"admin"值尝试了以下方法:
'AlternativeAdmin'
AlternativeAdmin
'Employee.AlternativeAdmin'
Employee.AlternativeAdmin
取消注释时遇到的错误是:
名称错误: 名称"替代管理员"未定义
我是一个自认的Python新手,我怀疑一些更好的Python理解可以帮助我解决这个问题。
我设法通过伟大的魔术八球(谷歌)找到了这一点:一个论坛海报是这样说的(原文如此),"愚蠢的我,我坚持认为备用管理员类是一个内部类,就像原来的一样。一旦我解开了它的嵌套,它就起作用了。他引用了以下代码:
class A(Entity):
...
class Admin(EntityAdmin):
...
class AdminEmbedded(EntityAdmin):
...
class B(Entity):
classA = OneToMany(...)
...
class Admin(EntityAdmin):
field_attributes = dict(classA=dict(admin=A.AdminEmbedded???))
不幸的是,他的语法和/或拼写让人很难辨别他的意思。另外,我很确定那里应该有一些引号。
我想通了。答案引起了一个掌脸 - 我在取消嵌套后将 AlternativeAdmin 类定义留在下面调用它的位置。一旦我把它移到上面,它工作正常。
这是我问题中示例的完整固定版本:
from sqlalchemy.schema import Column
from sqlalchemy.types import Unicode, Integer
from camelot.admin.entity_admin import EntityAdmin
from camelot.core.orm import Entity, ManyToOne, OneToMany
import camelot.types
class AlternativeAdmin(EntityAdmin):
verbose_name = 'Employee'
list_display = ['name']
class Company(Entity):
__tablename__ = 'company'
name = Column(Unicode())
city = Column(Unicode())
employees = OneToMany('Employee')
def __unicode__(self):
return self.name or ''
class Admin(EntityAdmin):
verbose_name = 'Company'
verbose_name_plural = 'Companies'
list_display = ['name', 'city', 'employees']
field_attributes = {'employees': {'create_inline': True,
'admin': AlternativeAdmin}}
class Employee(Entity):
__tablename__ = "employee"
name = Column(Unicode())
age = Column(Integer())
company = ManyToOne('Company')
def __unicode__(self):
return self.name or ''
class Admin(EntityAdmin):
verbose_name = 'Employee'
list_display = ['name', 'age', 'company']