web2py 自动填充/自动完成返回 ID

0 投票
2 回答
1199 浏览
提问于 2025-04-17 03:58

我有一个表单,我想根据数据库里的信息和已填写的字段自动填充它:

在 db_wizard.py 文件中

db.define_table('receiver',
  Field('name'), # e.g. Daniel
  Field('email'),# e.g. daniel@daniel.com
  Field('opening'), # e.g. Dear Daniel
  ...)           

db.define_table('sender',
  Field('name'),  # e.g. John
  Field('email'), # e.g. John@john.com
  Field('tel'),   # e.g. 111 222 111
  ...)

db.define_table('letter',
  Field('sender', db.sender.id),     # e.g. Daniel
  Field('receiver', db.receiver.id), # e.g. John
  Field('opening'), # should be filled automatically when choosing/changing the value of "receiver"
  ...)

我使用了 plugin_lazy_widget

db.letter.opening.widget = suggest_widget(db.receiver.opening, id_field=db.i2l_receiver_profile.id, 
                                          limitby=(0,10), min_length=1, db=db(db.i2l_receiver_profile.user_id==auth.user_id))

但是这个小部件,或者说 web2py_autocomplete_widget,总是返回所选记录的 ID!而不是我们在“opening”里实际输入的内容,比如上面的例子:它返回 1,而不是 亲爱的丹尼尔

2 个回答

0

我觉得你不需要使用suggest_widget(或者内置的自动完成小部件)。相反,你想要的是在用户选择接收者后,'opening'字段能够自动填充。为此,你可能需要一个修改过的lazy_options_widget(而不是和suggest_widget一起使用)。

另外,注意使用id_field和'opening'字段结合也不合适,因为它不是一个引用字段(所以没有相关的id可以引用)。

0

换句话说:

db.letter.opening.widget = suggest_widget(db.receiver.opening, id_field=db.i2l_receiver_profile.id, 
                                          limitby=(0,10), min_length=1, db=db(db.i2l_receiver_profile.user_id==auth.user_id))

可以使用:

db.letter.opening.widget = suggest_widget(db.receiver.opening, 
                                          limitby=(0,10), min_length=1, db=db(db.i2l_receiver_profile.user_id==auth.user_id))

这意味着如果不定义 "id_field",就会阻止它的使用。

撰写回答