Web2Py list:reference table, 加载和设置数据
Web2Py list:reference table, Load and set data
也许我遗漏了一些荒谬的东西,我没有看到,但这是我学习 web2py 的第一个应用程序。
我无法在 Table 电影中输入数据,其中包含与其他表相关的字段。
列表已加载,但未在电影注册中注册。
根据代码和结果。
db.py
Movie = db.define_table('movies',
Field('title','string', label = 'Title'),
Field('date_release','integer', label = 'Date Release'),
Field('duraction','integer', label = 'Duraction'),
Field('category','string','list:reference categories', label = 'Category'),
Field('actor','list:reference actors', label = 'Actor'),
Field('director','list:reference directors', label = 'Diretor'),
)
Category = db.define_table('categories',
Field('title','string', label = 'Title'),
)
validators.py
Movie.title.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db, 'movies.title')]
Movie.category.requires = IS_IN_DB(db, 'categories.title')
Movie.director.requires = IS_IN_DB(db, 'directors.name')
Movie.actor.requires = IS_IN_DB(db, 'actors.name')
Movie.duraction.requires = IS_INT_IN_RANGE(0, 1000)
Category.title.requires = IS_NOT_EMPTY()
movie.py
def add():
form = SQLFORM(Movie)
if form.process().accepted:
response.flash = "Successful! New movie added!"
redirect(URL('add'))
elif form.errors:
response.flash = 'Error'
else:
response.flash = 'Form, set data'
return dict(form = form)
列表加载另一个表 - 确定:
列表项未记录在数据库中:
表单中显示的小部件基于您指定的 IS_IN_DB
字段验证器,您的编码方式存在三个问题。
首先,list:reference
字段与标准 reference
类型字段一样,存储它们引用的记录的记录 ID——它们不存储引用记录中其他字段的值。因此,IS_IN_DB
验证器的第二个参数应该始终是 ID 字段(例如,categories.id
)。
其次,尽管该字段将存储记录 ID,但您希望表单小部件显示每条记录的其他更具描述性的表示形式,因此您应该指定 IS_IN_DB
验证器的 "label" 参数(例如,label='%(title)s'
)。
第三,list:reference
字段允许多项选择,因此您必须将 IS_IN_DB
验证器的 "multiple" 参数设置为 True
。这将在表单中产生一个 multi-select 小部件。
因此,生成的验证器应如下所示:
Movie.category.requires = IS_IN_DB(db, 'categories.id', label='%(title)s', multiple=True)
以上将允许选择多个 db.categories
ID,但表单小部件将显示类别标题而不是实际 ID。
现在,如果您在 db.movies
table 之前定义引用的 tables ,则上述所有操作都可以变得更加容易并为每个 table:
指定一个 format
参数
Category = db.define_table('categories',
Field('title','string', label = 'Title'),
format='%(title)s')
Movie = db.define_table('movies',
...,
Field('category', 'list:reference categories', label = 'Category'),
...)
使用上面的代码,根本不需要显式指定 IS_IN_DB
验证器,因为 db.movies.category
字段将自动获得一个与上面指定的完全相同的默认验证器(format
db.categories
table 的属性用作 label
参数)。
您可能需要阅读有关 list:reference
fields and the IS_IN_DB
validator 的文档。
顺便说一句,您可以考虑在 table 定义中指定字段验证器(通过 Field()
的 requires
参数),因为这样更简洁,保留所有 schema-related 细节集中在一处,无需在每次请求时读取和执行额外的模型文件。
也许我遗漏了一些荒谬的东西,我没有看到,但这是我学习 web2py 的第一个应用程序。 我无法在 Table 电影中输入数据,其中包含与其他表相关的字段。
列表已加载,但未在电影注册中注册。 根据代码和结果。
db.py
Movie = db.define_table('movies',
Field('title','string', label = 'Title'),
Field('date_release','integer', label = 'Date Release'),
Field('duraction','integer', label = 'Duraction'),
Field('category','string','list:reference categories', label = 'Category'),
Field('actor','list:reference actors', label = 'Actor'),
Field('director','list:reference directors', label = 'Diretor'),
)
Category = db.define_table('categories',
Field('title','string', label = 'Title'),
)
validators.py
Movie.title.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db, 'movies.title')]
Movie.category.requires = IS_IN_DB(db, 'categories.title')
Movie.director.requires = IS_IN_DB(db, 'directors.name')
Movie.actor.requires = IS_IN_DB(db, 'actors.name')
Movie.duraction.requires = IS_INT_IN_RANGE(0, 1000)
Category.title.requires = IS_NOT_EMPTY()
movie.py
def add():
form = SQLFORM(Movie)
if form.process().accepted:
response.flash = "Successful! New movie added!"
redirect(URL('add'))
elif form.errors:
response.flash = 'Error'
else:
response.flash = 'Form, set data'
return dict(form = form)
列表加载另一个表 - 确定:
列表项未记录在数据库中:
表单中显示的小部件基于您指定的 IS_IN_DB
字段验证器,您的编码方式存在三个问题。
首先,list:reference
字段与标准 reference
类型字段一样,存储它们引用的记录的记录 ID——它们不存储引用记录中其他字段的值。因此,IS_IN_DB
验证器的第二个参数应该始终是 ID 字段(例如,categories.id
)。
其次,尽管该字段将存储记录 ID,但您希望表单小部件显示每条记录的其他更具描述性的表示形式,因此您应该指定 IS_IN_DB
验证器的 "label" 参数(例如,label='%(title)s'
)。
第三,list:reference
字段允许多项选择,因此您必须将 IS_IN_DB
验证器的 "multiple" 参数设置为 True
。这将在表单中产生一个 multi-select 小部件。
因此,生成的验证器应如下所示:
Movie.category.requires = IS_IN_DB(db, 'categories.id', label='%(title)s', multiple=True)
以上将允许选择多个 db.categories
ID,但表单小部件将显示类别标题而不是实际 ID。
现在,如果您在 db.movies
table 之前定义引用的 tables ,则上述所有操作都可以变得更加容易并为每个 table:
format
参数
Category = db.define_table('categories',
Field('title','string', label = 'Title'),
format='%(title)s')
Movie = db.define_table('movies',
...,
Field('category', 'list:reference categories', label = 'Category'),
...)
使用上面的代码,根本不需要显式指定 IS_IN_DB
验证器,因为 db.movies.category
字段将自动获得一个与上面指定的完全相同的默认验证器(format
db.categories
table 的属性用作 label
参数)。
您可能需要阅读有关 list:reference
fields and the IS_IN_DB
validator 的文档。
顺便说一句,您可以考虑在 table 定义中指定字段验证器(通过 Field()
的 requires
参数),因为这样更简洁,保留所有 schema-related 细节集中在一处,无需在每次请求时读取和执行额外的模型文件。