2013-08-06 1 views
0

J'essayais d'implémenter la soumission de formulaire Ajax comme contexte donné AJAX Form Submission(inline success) mais cela ne fonctionne pas dans mon cas, voici mon code.Impossible d'implémenter la soumission de formulaire AJAX (succès en ligne) avec deform_bootstrap

@view_config(route_name='add_user', permission='admin', renderer='add_user.mako') 
def add_user(self): 

    #adding succeed method as per given context in above link. 
    def succeed(): 
     return Response('<div id="thanks">Thanks!</div>') 

    schema = UserSchema(validator = user_DoesExist).bind(request=self.request) 
    #Form defined with use_ajax=True. 
    form = deform.Form(schema, action=self.request.route_url('add_user'), buttons=('Add User','Cancel'), use_ajax=True) 

    if 'Cancel' in self.request.params: 
     return HTTPFound(location = self.request.route_url('home')) 

    if 'Add_User' in self.request.params: 
     appstruct = None 
     try: 
      appstruct = form.validate(self.request.POST.items()) 
     except deform.ValidationFailure, e: 
      log.exception('in form validated') 
      return {'form':e.render()} 

     newuser = User(username=appstruct['username'], 
         name=appstruct['name'], 
         extension=appstruct['extension'], 
         pin=appstruct['pin'], 
         status=1) 

     DBSession.add(newuser) 
     DBSession.flush() 
     return dict(form=form.render(success=succeed)) 
    return dict(form=form.render(appstruct={})) 

Sortie: Le formulaire de soumission du code est exécuté, mais la forme sur l'écran reste inchangé mais il n'exécute pas la méthode de réussir(). :(

Et si l'essayer avec exactement le même contexte comme indiqué dans le lien ci-dessus comme

@view_config(route_name='add_user', permission='admin', renderer='add_user.mako', name='ajaxform') 
@demonstrate('AJAX form submission (inline success)') 
def ajaxform(self): 

    #adding succeed method as per given context in above link. 
    def succeed(): 
     return Response('<div id="thanks">Thanks!</div>') 

    schema = UserSchema(validator = user_DoesExist).bind(request=self.request) 
    #Form defined with use_ajax=True. 
    form = deform.Form(schema, action=self.request.route_url('add_user'), buttons=('Add User','Cancel'), use_ajax=True) 

    if 'Cancel' in self.request.params: 
     return HTTPFound(location = self.request.route_url('home')) 

    if 'Add_User' in self.request.params: 
     appstruct = None 
     try: 
      appstruct = form.validate(self.request.POST.items()) 
     except deform.ValidationFailure, e: 
      log.exception('in form validated') 
      return {'form':e.render()} 

     newuser = User(username=appstruct['username'], 
         name=appstruct['name'], 
         extension=appstruct['extension'], 
         pin=appstruct['pin'], 
         status=1) 

     DBSession.add(newuser) 
     DBSession.flush() 
     return self.render_form(form, success=succeed) 
    return dict(form=form.render(appstruct={})) 

Sortie: NameError: nom 'démontrer' ne définit pas

si je retire cette ligne @demonstrate ('Soumission de formulaire AJAX (succès en ligne)')

que je ne me donne erreur:

AttributeError: objet 'UsersView' n'a pas d'attribut 'render_form'

Besoin d'aide pour effectuer une soumission de formulaire ajax en utilisant deform_bootstrap.

Merci,

me corriger si je me trompe quelque part. :)

Répondre

0

J'ai eu le même problème. Le problème est que la fonction de rendu formulaire ne prend pas en fait un argument de mot-clé de succès à savoir

form.render(success='<div>here</div') 

va pas vraiment à ce que vous pensez. Si vous regardez le code de démonstration, vous pouvez voir qu'ils appellent une autre fonction

self.render_form(form, success='<div>here</div>') 

Cette fonction est tout à fait distincte de la fonction de rendu de formulaire. Il traite l'appel (supposons un message valide) et ensuite, si la validation est réussie, vérifie si le mot «succès» est défini et renvoie celui-ci en tant que HTML dans un objet de réponse. Sinon, il renvoie 'form.render' dans l'objet de réponse.

Espérons que ça aide.

Keith

Questions connexes