Camelot(Python框架):指定另一个EntityAdmin

时间:2013-12-18 21:22:06

标签: python sqlalchemy

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

注意:

  • "管理"在Company.Admin.field_attributes
  • " AlternativeAdmin"类

此代码运行时没有错误,但无法按预期运行。公司表单显示一个显示姓名,年龄和公司的员工子表单。它应该只显示公司。我已经为" 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???))

不幸的是,他的语法和/或拼写很难分辨出他的意思。此外,我很确定那里应该有一些引用。

1 个答案:

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