【问题标题】:How to set default orderby in a web2py table?如何在 web2py 表中设置默认 orderby?
【发布时间】:2015-01-30 15:05:06
【问题描述】:

虽然我认为这是一项简单的任务,但在使用 SQLFORM 时我找不到让它工作的方法。假设我以这个结构为例:

db.define_table('month',
    Field('name', 'string'),
    format='%(nombre)s'
)

db.define_table('foo'
    Field('bar', 'string'),
    Field('month', db.month), # I want to sort this by ID
    format='%(bar)s'
)

db.month.update_or_insert(id=1, nombre='January')
db.month.update_or_insert(id=2, nombre='Frebruary')
# ...
db.month.update_or_insert(id=12, nombre='December')

在视图中:

def example():
    form = SQLFORM(db.foo).process()
    if form.accepted:
        redirect(URL('default', 'foo'))
    return dict(form=form)

form 按字母顺序对月份进行排序,这不是期望的行为,我想显示按 ID 排序的月份。有没有办法在表格中设置默认顺序?

db.month.orderby = db.month.id # Not working
db.month._orderby = db.month.id # Not working

【问题讨论】:

    标签: python forms web2py


    【解决方案1】:

    db.foo.month 字段是一个引用字段,默认情况下,它会获得一个IS_IN_DB 验证器,这会导致在表单中生成选择小部件。选择小部件包含“月”表记录的 ID 作为值,但由于 db.month 表的“格式”属性,它会在下拉列表中显示月份名称。默认情况下,下拉列表中的项目最终按格式字符串中指定的字段(在本例中为月份名称)排序。要改变这一点,您可以手动定义验证器并指定“orderby”参数:

    db.foo.month.requires = IS_IN_DB(db, 'month.id', db.month._format,
                                     orderby=db.month.id)
    

    【讨论】:

    • 非常感谢@Anthony!解决了
    • 这可能不是问这个问题的最佳地方,但是如果月份有一个外键并且我想根据其中的某个字段进行排序怎么办?说orderby=db.month.foobar_id.name 之类的?
    • 在这种情况下,您可能必须手动构建一组值和标签,而使用IS_IN_SET 验证器。
    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 2019-07-23
    • 2019-12-31
    • 1970-01-01
    • 2014-01-09
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多