2013-01-13 1 views
0

Je travaille sur un site Web qui a une page "Inscription" qui devrait être appelable de n'importe où sur le site.Câblage des actions de formulaire de modèle avec le code Python

Je l'interface factice suivante et la mise en œuvre du produit « utilisateur »:

Interface:

## 
## located in bahmanm/sampleapp/interfaces.py 
## 
class ISampleAppUser(Interface): 
     """ 
     """ 

Mise en œuvre:

## 
## located in bahmanm/sampleapp/implementation/SampleAppUser.py 
## 
class SampleAppUser: 
     """ 
     """ 

     implements(ISampleAppUser) 

# Note that this method is outside of the implementation class. 
# 
def manage_addSampleAppUser(self, id, title): 
    # ... 

Maintenant, pour l'instant, supposons il y a un lien sur la page index qui mène au modèle suivant (Modèle d'inscription):

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns="http://xml.zope.org/namespaces/tal"> 
    <head><title>Add a new User</title></head> 
    <body> 
    <h2>Add a user instance</h2> 
    <form action="#" method="POST" 
      tal:attributes="action python:'manage_addSampleAppUser'"> 
     <p>Id: <input type="text" name="id"/></p> 
     <p>Title: <input type="text" name="title"/></p> 
     <input type="submit" value="Add"/> 
    </form> 
    </body> 
    </html> 

Cependant, je n'ai pas été en mesure de trouver la bonne valeur pour la propriété action du form; tout ce que je reçois est une "ressource introuvable". Honnêtement, je crois que c'est un problème de comprendre les mécanismes de Zope de mon côté. J'apprécierais vraiment des indices/indices sur où devrais-je aller creuser pour la solution, configure.zcml ou l'implémentation ou le modèle lui-même. TIA,

Répondre

1

Vous voulez vraiment créer une vue pour cela; Vous pouvez également appeler une fabrique de produits à partir d'une URL, mais ce n'est pas recommandé.

Avec vue, vous pouvez combiner la forme et le code pour créer le nouvel utilisateur dans un seul endroit:

from zope.publisher.browser import BrowserPage 
from sampleapp.implementation.SampleAppUser import manage_addSampleAppUser 


class NewUserSignup(BrowserPage): 
    def __call__(self): 
     # called when the view is being rendered 
     if 'submit' in self.request: 
      # form was submitted, handle 
      self.addUser() 
     return self.index() # render the template 

    def addUser(self): 
     # extract form fields from self.request.form 
     # validation, error handling, etc. 
     if someerror: 
      self.error = 'Error message!' 
      return 

     user = manage_addSampleAppUser(self.context, id, title) 
     # add things to this new user if needed 

     # all done, redirect to the default view on the new user object 
     self.request.response.redirect(user.absolute_url()) 

alors inscrivez-vous ce point de vue avec quelque chose comme:

<browser:page 
    for="*" 
    name="signup" 
    class=".signup.NewUserSignup" 
    template="signup.pt" 
    permission="zope.public" 
    /> 

Lorsque votre nouveau la page est enregistrée, le template nommé est ajouté en tant qu'attribut index sur votre classe NewUserSignup, de sorte que la méthode __call__ peut l'appeler (self.index()) et renvoyer les résultats. Parce que vous avez combiné la gestion de l'inscription et le modèle ensemble, vous pouvez maintenant facilement intégrer la gestion des erreurs. Lorsque quelqu'un charge la page pour la première fois, self.request.form sera vide, mais dès que quelqu'un touche le bouton d'envoi, vous pouvez le détecter et appeler la méthode addUser.

Cette méthode peut soit créer l'utilisateur, puis rediriger à partir de cette page, ou définir un message d'erreur et revenir, à quel point le formulaire est rendu.

Cela rend le action facile à régler; vous pouvez simplement le laisser vide, ou vous pouvez le définir sur l'URL du contexte actuel plus le nom de la vue. Ensemble, le modèle devient alors:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns="http://xml.zope.org/namespaces/tal"> 
    <head><title>Add a new User</title></head> 
    <body> 
    <h2>Add a user instance</h2> 
    <div class="errormessage" tal:condition="view/error|nothing" tal:content="view/error"> 
     Conditional error message appears here 
    </div> 

    <form action="#" method="POST" 
      tal:attributes="action string:${context/absolute_url}/@@${view/__name__}"> 
     <p>Id: <input type="text" name="id" 
         tal:attributes="value request/form/id|nothing" /></p> 
     <p>Title: <input type="text" name="title" 
         tal:attributes="value request/form/title|nothing" /></p> 
     <input type="submit" value="Add" name="submit"/> 
    </form> 
    </body> 
</html> 

Notez comment les données du formulaire sont pré-remplies avec les données existantes de la demande ainsi, ce qui rend plus facile pour vos visiteurs de corriger les erreurs qu'ils ont faites.

+0

Excellente réponse! Met tout ce dont j'avais besoin pour comprendre cette entreprise «vue» en un seul endroit. Merci un million @Martijn. –

Questions connexes