probleme beim valedieren

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

Hi,

ich noch mal... :)

jetzt will ich eine Zahl in einem Formular eingeben und beim klicken auf den Submit Button sollen die daten an ein Valedierungsscript gesendet werden. Dort soll kontrolliert werden ob die Zahl existiert usw.
Das ganze hab ich mal so versucht:
Formular:

Code: Alles auswählen

<html>
  <head>
    <title tal:content="template/title">The title</title>
  </head>
  <body>    
      <form method="POST" 
             tal:define="errors options/state/getErrors"
             tal:attributes="action template/id;">
      <p>Enter a number: <input name="num" type="text" value=""></p>
      <p><input type="submit" name="form.button.submit" value="Submit" /></p>
      <input type="hidden" name="form.submitted" value="1" />
    </form>

  </body>
</html>
Hier die Valedierung:

Code: Alles auswählen

##bind container=container
##bind context=context
##bind namespace=
## parameters=
##title="test_validator"
num=context.REQUEST.get('num',None)
try:
    int(num)
except ValueError:
    state.setError("num", "Keine Zahl", new_status="failure")
except TypeError:
    state.setError("num", "Keine Zahl eingegeben.", new_status="failure")
if state.getErrors():
    state.set(portal_status_message="Bitte Fehler korrigieren.")
return state
Bei dem Contorller Page Template hab ich eingestellt im Reiter "Validation" --> der Name "test_cpt", context=any,button="",validators="test_validator".
Im Reiter "Actions" --> Name "test_cpt", status="success", action="redirect_to".
Als fehler kommt:
cannot concatenate 'str' and 'dict' objects
mfg mitchi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

mitch hat geschrieben:Bei dem Contorller Page Template hab ich eingestellt im Reiter "Validation" --> der Name "test_cpt", context=any,button="",validators="test_validator".
Im Reiter "Actions" --> Name "test_cpt", status="success", action="redirect_to".
Hi Mitch!

Schreibe bitte immer dazu, ob es sich um ein Plone- oder um ein Zope-Problem handelt, da sich die Plone-API sehr von der reinen Zope-Api unterscheidet.

Dein Beispiel sollte aber unterhalb einer Plone-Site einwandfrei funktionieren. Auch mein Test hat funktioniert. Allerdings musste ich bei der Action als Argument ``string:test_cpt`` angeben, damit bei korrekter Eingabe einer Zahl kein Fehler erscheint.

Sonst fällt mir nichts dazu ein.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Aktiviere dir im ``portal_quickinstaller`` das Produkt *PloneErrorReporting*. Dann sind die Fehlermeldungen aussagekräftiger.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

Hi,

na ja es klappt bei mir irgendwie nicht.
Ich geh doch recht in der annahme, dass das Template die Zahl einliest und diese via des submit buttons an mein valedierungsscript weitergeleitet wird. Dort wird es dann in eine lokale Variable gespeichert und mit Hilfe von try und except ausgewertet. Das Ergebnis wird dann wieder zurück an das Formular (Template) geschickt und da dann dargestellt oder? Also wenn ich jetzt z.B. "hallo" eingebe und abschicke müsste doch dann da stehen: "keine zahl" oder ?

mfg mitch


edit:

Jetzt habe ich mal veruscht im Aktion Reiter die "Action" auf "Traverse to action" zu stellen, damit er einen Fehler zeigt.
Der Fehler ist:
Validator test_validator did not return the state object
und

Code: Alles auswählen

Traceback (innermost last):
  Module ZPublisher.Publish, line 115, in publish
  Module ZPublisher.mapply, line 88, in mapply
  Module ZPublisher.Publish, line 41, in call_object
  Module Products.CMFFormController.ControllerPageTemplate, line 80, in __call__
  Module Products.CMFFormController.BaseControllerPageTemplate, line 37, in _call
  Module Products.CMFFormController.FormController, line 380, in validate
ValueError: Validator test_validator did not return the state object
[/quote]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

mitch hat geschrieben:Das Ergebnis wird dann wieder zurück an das Formular (Template) geschickt und da dann dargestellt oder? Also wenn ich jetzt z.B. "hallo" eingebe und abschicke müsste doch dann da stehen: "keine zahl" oder ?
Hi Mitch!

Dein Code ist korrekt. Aber, ein "Keine Zahl" wird dir nicht angezeigt werden, da du den "error" in der Seitenvorlage nicht anzeigst.
Das ändert aber nichts daran, dass ansonsten dein Code keinen Fehler verursachen dürfte.

Erstelle dir einen neuen Ordner -- erstelle eine "Controller Page Template" mit einem anderen Namen -- erstelle dir ein "Controller Validator" mit einem anderen Namen -- Im "Controller Page Template" im Reiter "Validation" gibst du ganz oben, im Feld "Validators" den Namen des "Controller Validators" ein -- Im "Controller Page Template" im Reiter "Actions" gibst du ganz oben im Feld "Status" den Wert "success" und im Feld "Argument" den Wert "string:<name_deiner_seitenvorlage>" ein.

FERTIG! Genau so funktioniert es auch bei mir in meinem Test. Ich habe nichts am Code verändert und auch sonst nichts besonderes gemacht.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten