数据库模型结构如下所示。
我想向用户提交一份要求提供hostel_name的注册表单,然后在后端转换hostel_name以根据旅馆ID存储它。
控制器/ default.py
def user():
return dict(form=auth())
模型/ db.py
db.define_table(
'hostels',
Field('hostel_admin_group_id', 'integer'),
Field('hostel_residents_group_id', 'integer'),
Field('hostel_name', length=32, unique=True),
)
db.define_table(
'users',
Field('username', length=32, unique=True),
Field('password', 'password', length=32, readable=False, label='Password'),
Field('first_name', 'string', length=32, default=''),
Field('last_name', 'string', length=32, default=''),
Field('email_id', 'string', length=32),
Field('degree_name', 'string', length=32),
Field('hostel_id', db.hostels),
Field('picture_id', 'integer'),
Field('year_of_degree', 'integer'),
)
视图/ user.html
{{extend 'layout.html'}}
<h2>
{{=T('Sign Up') if request.args(0) == 'register' else T('Log In') if request.args(0) == 'login' else T(request.args(0).replace('_',' ').title())}}
</h2>
<div class="container">
<div class="row">
<div id="web2py_user_form" class="col-lg-6">
{{
if request.args(0)=='login':
if not 'register' in auth.settings.actions_disabled:
form.add_button(T('Sign Up'),URL(args='register', vars={'_next': request.vars._next} if request.vars._next else None),_class='btn btn-default')
pass
if not 'request_reset_password' in auth.settings.actions_disabled:
form.add_button(T('Lost Password'),URL(args='request_reset_password'),_class='btn btn-default')
pass
pass
=form
}}
</div>
</div>
</div>
{{block page_js}}
<script>
jQuery("#web2py_user_form input:visible:enabled:first").focus();
{{if request.args(0)=='register':}}
web2py_validate_entropy(jQuery('#auth_user_password'),100);
{{elif request.args(0)=='change_password':}}
web2py_validate_entropy(jQuery('#no_table_new_password'),100);
{{pass}}
</script>
{{end page_js}}
上面的代码向用户提供注册表格,并希望用户输入旅馆ID。我需要更改什么才能启用此功能?
感谢任何帮助。
答案 0 :(得分:1)
您可以为IS_IN_DB
字段明确定义hostel_id
验证程序,提供label
参数以指定要在HTML选择窗口小部件中使用的标签:
Field('hostel_id', db.hostels,
requires=IS_IN_DB(db, 'hostels.id', label='%(hostel_name)s'),
represent=lambda ref, row: ref.hostel_name)
IS_IN_DB
验证程序将导致SQLFORM
为该字段生成一个选择窗口小部件,其label
参数将导致hostel_name
字段用于生成标签即使实际的db.hostels.id
值将插入数据库中,也可以使用小部件。
represent
属性指定值如何以只读形式和网格显示。
注意,所有上述(requires
和represent
属性)都可以更简单地实现,只需在定义format
表时指定db.hostels
参数:
db.define_table(
'hostels',
Field('hostel_admin_group_id', 'integer'),
Field('hostel_residents_group_id', 'integer'),
Field('hostel_name', length=32, unique=True),
format='%(hostel_name)s')
使用上述format
参数,引用db.hostels
的所有表格都会自动获得IS_IN_DB
验证码和represent
属性,如上所示。
最后,如果您打算使用web2py Auth系统,而不是创建自己的users
表,则应该只是扩展或重新定义标准db.auth_user
表。这是here的解释。另外,出于安全考虑,您不应将密码存储为纯文本 - 因此您应该使用带有密码字段的CRYPT
验证器(标准db.auth_user
表自动执行此操作)。