Web2Py list:reference table, Load and set data

Posted

技术标签:

【中文标题】Web2Py list:reference table, Load and set data【英文标题】: 【发布时间】:2016-08-24 01:08:20 【问题描述】:

也许我错过了一些荒谬的东西,我没有看到,但这是我第一个学习 web2py 的应用程序。 我无法在具有与其他表格相关的字段的表格电影中输入数据。

列表已加载,但未在电影注册中注册。 根据代码和结果。

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'),
)

验证器.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()

电影.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)

列表加载另一个表 - 好的:

列表中未记录在数据库中的项目:

【问题讨论】:

【参考方案1】:

表单中显示的小部件基于您指定的IS_IN_DB 字段验证器,您对它们的编码方式存在三个问题。

首先,list:reference 字段与标准 reference 类型字段一样,存储它们引用的记录的记录 ID——它们不存储引用记录中其他字段的值。因此,IS_IN_DB 验证器的第二个参数应该始终是 ID 字段(例如,categories.id)。

其次,虽然该字段将存储记录 ID,但您希望表单小部件显示每条记录的其他更具描述性的表示,因此您应该指定 IS_IN_DB 验证器的“标签”参数(例如,label='%(title)s' )。

第三,list:reference 字段允许多选,因此您必须将IS_IN_DB 验证器的“multiple”参数设置为True。这将导致表单中出现多选小部件。

因此,生成的验证器应如下所示:

Movie.category.requires = IS_IN_DB(db, 'categories.id', label='%(title)s', multiple=True)

上面将允许选择多个db.categories ID,尽管表单小部件将显示类别标题而不是实际 ID。

现在,如果您改为在db.movies之前定义引用表并为每个表指定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 属性987654341@ 表用作label 参数)。

您可能需要阅读有关 list:reference fields 和 IS_IN_DB validator 的文档。

顺便说一句,您可以考虑在表定义中指定字段验证器(通过 Field()requires 参数),因为这样更简洁,将所有与模式相关的详细信息保存在一个位置,并消除了需要在每个请求上读取并执行额外的模型文件。

【讨论】:

以上是关于Web2Py list:reference table, Load and set data的主要内容,如果未能解决你的问题,请参考以下文章

web2py官方文档翻译01

web2py--------------用web2py写 django的例子 --------开发环境

web2py官方文档翻译03

Python Web2py 初试水

Python之Web2py框架使用

如何在 web2py 中使用模块?