2016-03-26 10 views
1

データベースモデルの構造は次のとおりです。Web2Pyはバックエンドでauthフォームを処理します

私は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を入力することを期待しています。これを有効にするには何を変更する必要がありますか?

何か助けていただければ幸いです。

答えて

1

あなたは明示的にHTMLを選択ウィジェットで使用するラベルを指定するlabel引数を提供し、hostel_idフィールドのIS_IN_DBバリデータを定義することができます。

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が発生します実際のdb.hostels.idの値がデータベースに挿入されても、labelの引数を使用すると、hostel_nameフィールドがウィジェットのラベルを生成するために使用されます。

represent属性は、値を読み取り専用フォームとグリッドでどのように表示するかを指定します。

注、上記の全ての(両方requiresrepresent属性)db.hostelsテーブルを定義するときに単純にformat引数を指定することが多くを達成することができる。

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属性を自動的に取得します。

最後に、独自のusersテーブルを作成するのではなく、web2py Authシステムを使用する場合は、標準のdb.auth_userテーブルを拡張または再定義するだけです。これはhereと説明されています。また、セキュリティ上の理由から、パスワードをプレーンテキストとして保存しないでください。パスワードフィールドにCRYPTバリデータを使用する必要があります(標準db.auth_userテーブルでこれが自動的に行われます)。

+1

ありがとうございました。これにひどく詰まっていた。私は今日だけweb2pyを学び始めましたが、フォーマットがどのように使われるかを今は理解していませんでした。あなたに感謝します。 私の質問の別の1つを見てください。私はweb2pyを使用して残りのAPIを作成しようとしていますが、私はすでにそれが提供する容易さに魅了されています。しかし、私の定義されたapiのいくつかは不正行為です。詳細については、下のリンクをご覧ください。 http://stackoverflow.com/questions/36235871/web2py-rest-api-endpoint-gives-invalid-path-output –

関連する問題