Camelot(Python框架):指定替代EntityAdmin

Camelot(Python框架):指定替代EntityAdmin,python,sqlalchemy,Python,Sqlalchemy,在Camelot框架中,模型(从Entity子类)由一个嵌套类(从EntityAdmin子类)定义,该类定义了各种gui属性,如布局和其他小部件。文档表明可以定义多个EntityAdmins,然后由调用模型指定: 管理 对于关系字段,指定用于可视化关系另一端的管理类。默认为目标类的默认管理类。这可用于使one2many小部件中的表视图看起来与同一对象的默认表视图不同。 我似乎无法理解所需的语法。作为一个案例研究,有人能帮我找出如何使用包中的“camelot示例”来实现这一点吗?(Camelot

在Camelot框架中,模型(从Entity子类)由一个嵌套类(从EntityAdmin子类)定义,该类定义了各种gui属性,如布局和其他小部件。文档表明可以定义多个EntityAdmins,然后由调用模型指定:

管理 对于关系字段,指定用于可视化关系另一端的管理类。默认为目标类的默认管理类。这可用于使one2many小部件中的表视图看起来与同一对象的默认表视图不同。

我似乎无法理解所需的语法。作为一个案例研究,有人能帮我找出如何使用包中的“camelot示例”来实现这一点吗?(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_属性下的“admin”
  • “AlternativeAdmin”类
此代码运行时没有错误,但无法按预期工作。公司窗体显示一个显示姓名、年龄和公司的员工子窗体。它应该只是向公司展示。我尝试了以下“admin”值:

取消注释时出现的错误是:

名称错误:未定义名称“AlternativeAdmin”

我是一个自认是Python新手的人,我怀疑更好地理解Python可以帮助我解决这个问题

我设法通过great magic eight ball(谷歌)找到了这一点:一张论坛海报上这样写道(原文如此),“愚蠢的我,我坚持备用管理类与原始类一样是一个内部类。一旦我不重视它,它就起作用了。”他引用了以下代码:

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