Variablen an SQL-Methoden von HTML-übergeben

Django, Flask, Bottle, WSGI, CGI…
Antworten
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hy,
Ich bin gerade dabei mich durch das Zope Buch zu arbeiten,
bin jetzt bei SQL-Methoden angekommen.

Ich möchte über eine HTML- Seite von mir

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
       "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> 
  <title>Kleine Adressdatenbank</title> 
</head> 
<body> 

<h1>Füllen sie bitte folgende Felder aus</h1> 

<p>Bitte füllen sie alle Felder rücksichstvoll aus</p> 

<form action="kunden_eintragen"> 
  <table border="0" cellpadding="5" cellspacing="0" bgcolor="#E0E0E0"> 
    <tr> 
      <td align="right">Vorname:</td> 
      <td><input name="vorname" type="text" size="30" maxlength="30"></td> 
    </tr>
 
    <tr> 
      <td align="right">Nachname:</td> 
      <td><input name="zuname" type="text" size="30" maxlength="40"></td> 
    </tr> 

    <tr> 
      <td align="right">Straße:</td> 
      <td><input name="strasse" type="text" size="30" maxlength="40"></td> 
    </tr> 

    <tr> 
      <td align="right">Ort:</td> 
      <td><input name="ort" type="text" size="30" maxlength="40"></td> 
    </tr> 

    <tr> 
      <td align="right">Telefonnummer:</td> 
      <td><input name="telefon" type="text" size="30" maxlength="40"></td> 
    </tr>
 
    <tr> 
      <td align="right">Handynummer:</td> 
      <td><input name="mobil" type="text" size="30" maxlength="40"></td> 
    </tr>

    <tr> 
      <td align="right">E-mail Adresse:</td> 
      <td><input name="email" type="text" size="30" maxlength="40"></td> 
    </tr>
 
    <tr> 
      <td align="right" valign="top">Zusätzliche Informationen:</td> 
      <td><textarea name="info" rows="10" cols="50"></textarea></td> 
    </tr> 
    <tr> 
      <td align="right">Kunde eintragen:</td> 
      <td> 
        <input type="submit" value=" Eintragen "> 
        <input type="reset" value=" Abbrechen"> 
      </td> 
    </tr> 
  </table> 
</form> 

</body> 
</html>
Will dann eine SQL Methode aufrufen (die Kunden_eintragen heißt)

Code: Alles auswählen

insert into kunden (vorname, zuname, strasse, ort, telefon, mobil, email, info)
values (
  <dtml-sqlvar vorname type="string">,
  <dtml-sqlvar zuname type="string">,
  <dtml-sqlvar strasse type="string">,
  <dtml-sqlvar ort type="string">,
  <dtml-sqlvar telefon type="string">,
  <dtml-sqlvar mobil type="string">,
  <dtml-sqlvar email type="string">,
  <dtml-sqlvar info type="string"> 
)
Nur wenn ich jetzt in die HTML meine Daten eingebe, dann öffnet er noch einmal die Zeilen von der SQL-Methode zur eingabe der variablen.
Ich will aber direkt über das HTML die daten eintragen,
was muss ich denn dann anders machen?

Gruß Tim
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BoOnOdY hat geschrieben:Ich möchte über eine HTML- Seite von mir
[...] eine SQL Methode aufrufen
Hi Tim!

Das macht man normalerweise nicht direkt, da du von der SQL-Methode **nichts Verwertbares** zurück bekommst. Du musst als "action" des Formulars ein Objekt eingeben, das zuerst deine Werte übernimmt, die Werte überprüft, die Werte an die SQL-Methode schickt und dann noch zu einer Bestätigungsseite weiterleitet oder traversiert. --> "Python-Script"

So etwas wird meistens ein Dreiteiler.
- Seitenvorlage, mit dem Eingabeformular
- Python-Script als Action
- Seitenvorlage zum Bestätigen der Eingabe

Es ist sogar öfter mal der Fall, dass es ein Vierteiler wird, da man manchmal eine Bestätigungsseite braucht, in der zuerst alle Eingaben angezeigt werden. Sind alle Werte korrekt, klickt der Benutzer auf [Weiter >>] und dann erst wird gespeichert und die Bestätigungsseite angezeigt.

Im nächsten Beitrag habe ich ein Codebeispiel.

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:

Hier das Beispiel:

Startseite mit dem Formular (kunden_eintragen_startseite).

In dieser Startseite wird geprüft, ob eine "errormessage" über das aufrufende Python-Script oder über den REQUEST (GET/POST/COOKIE) übergeben wurde. Wenn ja, dann wird die Fehlermeldung angezeigt. So ist es auch mit den Feldwerten. Wurde ein Feldwert übermittelt, dann wird der Feldwert in das Feld geschrieben. Wenn nicht, dann wird das Feld leer gelassen. Ansonsten würde man bei jedem Fehler die Werte der Felder verlieren und der Benutzer müsste alles wieder neu eingeben.

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  <title>Kleine Adressdatenbank</title>
</head>
<body>

<h1>Füllen sie bitte folgende Felder aus</h1>

<p>Bitte füllen sie alle Felder rücksichstvoll aus</p>


<!-- Fehlermeldung BEGIN -->
<p tal:define="errormessage options/errormessage | python: None"
   tal:condition="errormessage"
   tal:content="errormessage"
   style="background-color: red;"
>[Fehlermeldung]</p>
<!-- Fehlermeldung END -->


<form action="kunden_eintragen_action"
      tal:attributes="action container/kunden_eintragen_action/absolute_url"
>
  <table border="0" cellpadding="5" cellspacing="0" bgcolor="#E0E0E0">
    <tr>
      <td align="right">Vorname:</td>
      <td>
        <input name="vorname" type="text" size="30" maxlength="30"
               tal:define="vorname options/vorname | request/vorname | nothing"
               tal:attributes="value vorname"
        >
      </td>
    </tr>
 
    <tr>
      <td align="right">Nachname:</td>
      <td>
        <input name="zuname" type="text" size="30" maxlength="40"
               tal:define="zuname options/zuname | request/zuname | nothing"
               tal:attributes="value zuname"
        >
      </td>
    </tr>

    <tr>
      <td align="right">Straße:</td>
      <td>
        <input name="strasse" type="text" size="30" maxlength="40"
               tal:define="strasse options/strasse | request/strasse | nothing"
               tal:attributes="value strasse"
        >
      </td>
    </tr>

    <tr>
      <td align="right">Ort:</td>
      <td>
        <input name="ort" type="text" size="30" maxlength="40"
               tal:define="ort options/ort | request/ort | nothing"
               tal:attributes="value ort"
        >
      </td>
    </tr>

    <tr>
      <td align="right">Telefonnummer:</td>
      <td>
        <input name="telefon" type="text" size="30" maxlength="40"
               tal:define="telefon options/telefon | request/telefon | nothing"
               tal:attributes="value telefon"
        >
      </td>
    </tr>
 
    <tr>
      <td align="right">Handynummer:</td>
      <td>
        <input name="mobil" type="text" size="30" maxlength="40"
               tal:define="mobil options/mobil | request/mobil | nothing"
               tal:attributes="value mobil"
        >
      </td>
    </tr>

    <tr>
      <td align="right">E-mail Adresse:</td>
      <td>
        <input name="email" type="text" size="30" maxlength="40"
               tal:define="email options/email | request/email | nothing"
               tal:attributes="value email"
        >
      </td>
    </tr>
 
    <tr>
      <td align="right" valign="top">Zusätzliche Informationen:</td>
      <td>
        <textarea name="info" rows="10" cols="50"
                  tal:define="info options/info | request/info | nothing"
                  tal:content="info"
        ></textarea>
      </td>
    </tr>
    
    <tr>
      <td align="right">Kunde eintragen:</td>
      <td>
        <input type="submit" value=" Eintragen ">
      </td>
    </tr>
  </table>
</form>

</body>
</html>
Python-Script (kunden_eintragen_action).

Dieses Python-Script prüft ob zumindest der Vorname und der Nachname (Zuname) angegeben wurde. Wenn nicht, dann wird zur Startseite zurück gegeben. Dabei werden alle Variablen wieder an die Startseite übermittelt. Diese Variablen können in der Startseite mit ``options/variablename`` abgefragt werden.

Code: Alles auswählen

## Script (Python) "kunden_eintragen_action"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=vorname = None, zuname = None, strasse = None, ort = None, telefon = None, mobil = None, email = None, info = None
##title=
##

# Funktion für den Fehlerfall
def get_startpage(errormessage = None):
    """
    Startseite aufrufen und zurück geben. Dabei werden Werte an die Startseite
    übermittelt. Diese können in der Seitenvorlage über "options.variablename" 
    abgefragt werden. VORSICHT! Das "return" kehrt nur von dieser Funktion
    zurück, beendet aber noch nicht dieses "Python-Script". Dazu muss das
    Ergebnis dieser Funktion per "return"-Anweisung weitergegeben werden.
    """
    
    return container.kunden_eintragen_startseite(
        errormessage = errormessage, vorname = vorname, 
        zuname = zuname, strasse = strasse, 
        ort = ort, telefon = telefon, mobil = mobil, 
        email = email, info = info
    )

# Pruefen
if not vorname:
    errormessage = "Geben Sie bitte einen Vornamen ein."
    return get_startpage(errormessage)

if not zuname:
    errormessage = "Geben Sie bitte einen Nachnamen (Zunamen) ein."
    return get_startpage(errormessage)
    
## Daten in die Datenbank eintragen (deaktiviert, da ich diese Funktion nicht habe)
#container.kunden_eintragen_sql(
#    vorname = vorname, zuname = zuname, strasse = strasse, ort = ort, 
#    telefon = telefon, mobil = mobil, email = email, info = info
#)

# Zur Bestätigungsseite traversieren. Die Variablen werden übergeben.
return container.kunden_eintragen_bestaetigung(
    vorname = vorname, zuname = zuname, strasse = strasse, ort = ort, 
    telefon = telefon, mobil = mobil, email = email, info = info
)
Bestätigungsseite (kunden_eintragen_bestaetigung).

Diese Seite zeigt noch einmal die Feldwerte auf.

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  <title>Kleine Adressdatenbank</title>
</head>
<body>

<h1>Die Adresse wurde erfolgreich eingetragen.</h1>

<p>
  Es handelte sich dabei um folgende Adresse:
</p>

<table>
  <tr>
    <td>Vorname: </td><td tal:content="options/vorname | request/vorname | nothing"></td>
  </tr>
  <tr>
    <td>Zuname: </td><td tal:content="options/zuname | request/zuname | nothing"></td>
  </tr>
  <tr>
    <td>Straße: </td><td tal:content="options/strasse | request/strasse | nothing"></td>
  </tr>
  <tr>
    <td>Ort: </td><td tal:content="options/ort | request/ort | nothing"></td>
  </tr>
  <tr>
    <td>Telefon: </td><td tal:content="options/telefon | request/telefon | nothing"></td>
  </tr>
  <tr>
    <td>Mobil: </td><td tal:content="options/mobil | request/mobil | nothing"></td>
  </tr>
  <tr>
    <td>Email: </td><td tal:content="options/email | request/email | nothing"></td>
  </tr>
  <tr>
    <td>Info: </td><td tal:content="options/info | request/info | nothing"></td>
  </tr>
</table>

<p>
  <a href="kunden_eintragen_startseite"
     tal:attributes="href container/kunden_eintragen_startseite/absolute_url"
  >Neue Adresse eintragen</a>
</p>

</body>
</html>
lg
Gerold
:-)

PS: Ich bin schon so auf XHTML eingeschworen, dass mir HTML 4 teilweise schon ziemlich merkwürdig vorkommt. :-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hey und danke :)
Nur einen kleinen Fehler hat das ganze noch ;)
und zwar die bestätigung klappt noch nicht,
du hattest in dem Phyton script als kleine Notiz geschrieben:

Startseite aufrufen und zurück geben. Dabei werden Werte an die Startseite
übermittelt. Diese können in der Seitenvorlage über "options.variablename"
abgefragt werden. VORSICHT! Das "return" kehrt nur von dieser Funktion
zurück, beendet aber noch nicht dieses "Python-Script". Dazu muss das
Ergebnis dieser Funktion per "return"-Anweisung weitergegeben werden.


Hast du ja auch im HTML bestätigung so übernommen, aber die variablen kommen da nicht rein,
ich werd das so machen, dass die daten aus der SQL datenbank ausgelesen werden und dann da angezeigt, ma sehen was sich machen lässt.

Naja eine kleine Frage hab ich noch,
wenn man keinen Wert eingibt, dann stehen in der PostgreSQL datenbank so unschöne '' drinne kommen die durch Zope oder woher?


Viele Grüße TIm
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BoOnOdY hat geschrieben:bestätigung klappt noch nicht
Hi Tim!

Dann stimmt bei dir noch irgendetwas nicht. Dieses Beispiel habe ich nicht aus dem Kopf heraus ins Forum geschrieben. Dieses Beispiel habe ich im Zope geschrieben und mehrmals ausprobiert. --> es funktioniert so wie von mir erwartet.

Gibt man in der Startseite keinen Vornamen oder keinen Nachnamen ein, dann wird vom Python-Script aus wieder die Startseite aufgerufen. Dabei werden alle Variablen wieder übergeben, damit die Felder mit den ursprünglichen Werten befüllt werden können.

Wurde mindestens der Vorname und der Nachname in das Formular auf der Startseite eingegeben, dann öffnet das Python-Script die Bestätigungsseite und übergibt an diese Seite alle Variablen, so dass in der Bestätigungsseite auch wieder die Feldwerte zur Verfügung stehen.

Der Hinweis auf das "return" gilt nur in der Funktion ``get_startpage``, da das eine Funktion in der Funktion (das Python-Script selbst) ist. Wenn man also von der Funktion ``get_startpage`` mit "return" zurück kehrt, dann ist man immer noch im *Python-Script* und muss vom Python-Script aus noch einmal ein "return" ausführen, damit man damit das Python-Script beendet.

Ganz unten, im Python-Script, braucht man kein zweites "return", da man sich dort ja direkt im Python-Script befindet und nicht in einer untergeordneten Funktion.

Wenn du das Formular abschickst, dann wird jedes Formularfeld übermittelt. Auch wenn es nichts enthält. Somit wird an das Python-Script für ein leeres Feld ein leerer String übergeben.
Dieser leere String wird natürlich auch an die SQL-Methode übermittelt. Möchtest du statt den leeren Strings ein None übermittelen, dann kannst du das vorher abfangen, indem du die Variablen prüfst und dann explizit auf None stellst.

z.B.:

Code: Alles auswählen

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