“点击并编辑”(同时 reledit )视图

通过Web UI更新数据的主要方法是 modify 对实体的操作,这将带来完整的形式。这在 HTML表单结构 章。

但是,还有另一种方法可以使用特定的 reledit (用于 关系版 )从中查看 cubicweb.web.views.reledit 模块。

这通常从默认主视图应用(请参见 主视图 )属性和关系部分。它使小版本更加方便。

当然,这可以在任何其他视图中使用。这里有一些关于它的功能和使用方法的说明。

使用 reledit

让我们从一个简单的例子开始:

class Company(EntityType):
     name = String(required=True, unique=True)
     boss = SubjectRelation('Person', cardinality='1*')
     status = SubjectRelation('File', cardinality='?*', composite='subject')

在某些视图代码中,我们可能希望显示这些属性/关系,并允许用户依次编辑这些属性/关系,而不必离开当前页面。我们将编写如下代码:

company.view('reledit', rtype='name', default_value='<name>') # editable name attribute
company.view('reledit', rtype='boss') # editable boss relation
company.view('reledit', rtype='status') # editable attribute-like relation

如果一个人想从老板的角度来编辑公司,就必须指出适当关系的角色。默认情况下,角色为 subject .

person.view('reledit', rtype='boss', role='object')

每一个都将提供一个不同的编辑小部件。这个 name 属性显然会得到一个文本输入字段。这个 boss 将通过选择框编辑关系,允许选择其他关系 Person 作为老板。这个 status 如果关系将公司定义为一个包含一个文件的复合实体,则它将提供其他操作。

  • addFile 当有一个的时候

  • delete 这个 File (如果基数允许)

此外,编辑关系或使用 add 操作将导致嵌入的版本/创建表单,允许对目标实体(即 File 在我们的示例中)而不仅仅是允许在现有文件中进行选择。

这个 reledit_ctrl 区域贸易协定

可使用Reledit诳ctrl rtag(在中定义)对已发布属性/关系的行为进行精细控制。 cubicweb.web.views.uicfg .

该RTAG提供四个控制变量:

  • default_value :可选默认值

    默认值是没有值时显示的值。

  • reload :布尔值、EID(重新加载到)或接受主题的函数

    返回bool/eid这在编辑影响当前显示页面的URL或其他部分的关系(或属性)时很有用。默认为false。

  • rvid :关系或组合的可选视图ID(作为str)

    版本默认值为“incontext”或“csv”,具体取决于基数。它们也可以通过子类化clickandeditformview和重新定义一个rvid(resp)来静态更改。_很多。

  • edit_target :'rtype'(编辑关系)或'related'(到

    编辑相关实体)这控制是编辑关系还是关系的目标实体。目前只有一对一关系支持目标实体版本。默认情况下,只要关系是复合的,并且是一对一的,就采用“相关”选项。

让我们看看如何使用这些控件。

from logilab.mtconverter import xml_escape
from cubicweb.web.views.uicfg import reledit_ctrl
reledit_ctrl.tag_attribute(('Company', 'name'),
                           {'reload': lambda x:x.eid,
                            'default_value': xml_escape(u'<logilab tastes better>')})
reledit_ctrl.tag_object_of(('*', 'boss', 'Person'), {'edit_target': 'related'})

这个 default_value 需要是XML转义的Unicode字符串。

这个 edit_target 标签 boss 关系设置为 related 将确保 Person 公司和个人协会的实体(使用标准的自动形式)。

最后, reload 键接受布尔值、EID或代表URL的Unicode字符串。如果提供了EID,它将在内部转换为URL。当需要重新加载而当前URL不合适时,eid/url大小写会有所帮助。常见的情况是键属性的版本,它是当前URL的一部分。如果一个用户更改了公司的名称 lozilablogilab ,在http://myapp/company/lozilab上重新加载将失败。然后,如果提供实体的EID,则会强制在http://myapp/company/42之类的东西上重新加载,而这些东西总是有效的。

禁用 reledit

默认情况下, reledit 在默认主视图的“属性”部分中显示的属性和关系上可用。如果要对某些属性或关系禁用它,可以使用 uicfg

from cubicweb.web.views.uicfg import primaryview_display_ctrl as _pvdc
_pvdc.tag_attribute(('Company', 'name'), {'vid': 'incontext'})

要在自动使用它的任何地方停用它,您可以在多维数据集视图的某个位置使用下面的代码段:

from cubicweb.web.views import reledit

class DeactivatedAutoClickAndEditFormView(reledit.AutoClickAndEditFormView):
    def _should_edit_attribute(self, rschema):
        return False

    def _should_edit_attribute(self, rschema, role):
        return False

def registration_callback(vreg):
    vreg.register_and_replace(DeactivatedAutoClickAndEditFormView,
                              reledit.AutoClickAndEditFormView)