“点击并编辑”(同时 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 如果关系将公司定义为一个包含一个文件的复合实体,则它将提供其他操作。
到 add 一 File 当有一个的时候
到 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的一部分。如果一个用户更改了公司的名称 lozilab 到 logilab ,在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)