Camelot(Python 框架):指定替代实体管理员



使用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']

最新更新