Camelot(Python框架):指定替代EntityAdmin
在Camelot框架中,模型(从Entity子类)由一个嵌套类(从EntityAdmin子类)定义,该类定义了各种gui属性,如布局和其他小部件。文档表明可以定义多个EntityAdmins,然后由调用模型指定: 管理 对于关系字段,指定用于可视化关系另一端的管理类。默认为目标类的默认管理类。这可用于使one2many小部件中的表视图看起来与同一对象的默认表视图不同。 我似乎无法理解所需的语法。作为一个案例研究,有人能帮我找出如何使用包中的“camelot示例”来实现这一点吗?(Camelot 13.04.13,Python 2.7.6) 下面是我的示例代码:Camelot(Python框架):指定替代EntityAdmin,python,sqlalchemy,Python,Sqlalchemy,在Camelot框架中,模型(从Entity子类)由一个嵌套类(从EntityAdmin子类)定义,该类定义了各种gui属性,如布局和其他小部件。文档表明可以定义多个EntityAdmins,然后由调用模型指定: 管理 对于关系字段,指定用于可视化关系另一端的管理类。默认为目标类的默认管理类。这可用于使one2many小部件中的表视图看起来与同一对象的默认表视图不同。 我似乎无法理解所需的语法。作为一个案例研究,有人能帮我找出如何使用包中的“camelot示例”来实现这一点吗?(Camelot
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_属性下的“admin”
- “AlternativeAdmin”类
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']
我很好奇为什么花括号版本不起作用,它应该同样起作用?花括号问题原来是一个简单的语法错误。我已经修复了答案,但在以前的版本中,我的“admin”键与“employees”的深度相同。
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']