2016-03-26 7 views
1

Die Datenbankmodellstruktur ist wie folgt.Web2Py-Handle-Authentifizierungsformular am Back-End

Ich möchte Benutzer mit einem Registrierungsformular, die nach hostel_name fragt und dann im Backend konvertieren den Hostelname, um es entsprechend Host ID speichern.

controller/default.py

def user(): 
    return dict(form=auth()) 

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

views/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}} 

Die obige vorliegende Code präsentiert Benutzer eine Registrierungs Form und erwartet, dass Benutzer die Herberge Identifikation eingeben. Was muss ich ändern, um dies zu ermöglichen?

Jede Hilfe wird geschätzt.

Antwort

1

Sie können einen IS_IN_DB Prüfer für das hostel_id Feld, Bereitstellen eines label Argument angeben Beschriftungen explizit definieren, die im HTML-select-Widget verwendet werden:

Field('hostel_id', db.hostels, 
      requires=IS_IN_DB(db, 'hostels.id', label='%(hostel_name)s'), 
      represent=lambda ref, row: ref.hostel_name) 

Der IS_IN_DB Validator verursachen SQLFORM ein ausgewähltes Widget zu erzeugen für das Feld, und seine label Argument wird dazu führen, dass das Feld hostel_name verwendet wird, um Etiketten für das Widget zu generieren, auch wenn die tatsächlichen db.hostels.id Werte in die Datenbank eingefügt werden. Das Attribut represent gibt an, wie Werte in schreibgeschützten Formularen und im Raster angezeigt werden.

Hinweis, alle der oben genannten (beide requires und represent Attribute) können mehr einfach nur das format Argument spezifiziert werden, werden erreicht, wenn die Definition der db.hostels Tabelle:

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

Mit dem obigen format Argument, alle Tabellen Diese Referenz db.hostels wird automatisch die IS_IN_DB Validator und represent Attribut wie oben angezeigt.

Schließlich, wenn Sie beabsichtigen, das web2py Auth-System zu verwenden, anstatt Ihre eigene users Tabelle zu erstellen, sollten Sie einfach die Standard-Tabelle db.auth_user erweitern oder neu definieren. Dies wird erklärt here. Aus Sicherheitsgründen sollten Sie Passwörter auch nicht im Klartext speichern. Verwenden Sie daher den Validator CRYPT mit dem Passwortfeld (die Standardtabelle db.auth_user erledigt dies automatisch).

+1

Hey vielen Dank. War dabei sehr festgefahren. Ich habe Web2py erst heute gelernt und wusste bis jetzt nicht, wie das Format verwendet werden kann. Vielen Dank an dich. Können Sie sich bitte eine andere meiner Fragen ansehen. Ich versuche mit Web2py eine Pause zu machen und bin schon von der Leichtigkeit, die es bietet, fasziniert. Aber einige meiner definierten Apis verhalten sich schlecht. Weitere Informationen finden Sie unter folgendem Link: http://stackoverflow.com/questions/36235871/web2py-rest-api-endpoint-gives-invalid-path-output –