使用Camelot框架,模型(从Entity子类化)使用嵌套类(来自EntityAdmin的子类)定义,该类定义各种gui属性,如布局和其他小部件。该文档表明可以定义多个EntityAdmins,然后由调用模型指定:
管理
如果是关系字段,则指定用于可视化关系另一端的管理类。默认为目标类的默认管理类。这可以用于使one2many小部件中的表视图看起来与同一对象的默认表视图不同。 Camelot: Field Attributes man page
我似乎无法弄清楚所需的语法。作为一个案例研究,任何人都可以帮助我弄清楚如何使用" camelot-example"在包中? (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']
注意:
此代码运行时没有错误,但无法按预期运行。公司表单显示一个显示姓名,年龄和公司的员工子表单。它应该只显示公司。我已经为" admin"尝试了以下内容:值:
'AlternativeAdmin'
AlternativeAdmin
'Employee.AlternativeAdmin'
Employee.AlternativeAdmin
取消注释时出现的错误是:
NameError:name' 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???))
不幸的是,他的语法和/或拼写很难分辨出他的意思。此外,我很确定那里应该有一些引用。
答案 0 :(得分:1)
我明白了。答案引起了一个面孔 - 我将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']