Ich habe folgendes Problem. Ich muss für meine Universität eine Firmenverwaltung schreiben und bin bisher recht weit gekommen. Jedoch bin ich bei meiner Bearbeitungsfunktion hängen geblieben. Ich möchte über mein URL-Parameter jeweils eine Form erzeugen, der Wert ist die jeweilige ID für den Bearbeitungsvorgang, die in der JSON-Datei meinen Eintrag ersetzt und habe die Vorarbeit dafür schon geleistet, sobald die Anforderung gesendet wird, erkennt mein CherryPy-Server dies nicht und leitet nicht gewollt in mein Safe-Formular. Bin auch gerne für ein Skypegesprächverfügbar, sollte die Hilfestellung mehr Zeit benötigen.
Die Parameteraufrufe lasse ich in den list.tpl's generieren und da findet auch der URL-Aufrufe per Link statt.
Bitte keine Verweise zur Benutzung von Django. Unser Professor hat nicht gestattet, dieses Framework zu benutzen.
Meine Anwendung sieht wie folgt auf dem Bild aus:
Startseite:
Erfassen:
Über Hilfestellung wäre ich sehr dankbar.
Code: Alles auswählen
# coding: utf-8
import cherrypy
from .database import Database_cl
from .view import View_cl
#----------------------------------------------------------
class Application_cl(object):
#----------------------------------------------------------
#-------------------------------------------------------
def __init__(self):
#-------------------------------------------------------
# spezielle Initialisierung können hier eingetragen werden
self.db_o = Database_cl()
self.view_o = View_cl()
@cherrypy.expose
#-------------------------------------------------------
def index(self):
#-------------------------------------------------------
return self.createList_p()
@cherrypy.expose
#-------------------------------------------------------
def add(self):
#-------------------------------------------------------
return self.createForm_p()
cherrypy.expose
#-------------------------------------------------------
def edit(self,id):
#-------------------------------------------------------
return self.createForm_p(id)
@cherrypy.expose
#-------------------------------------------------------
def save(self, **data_opl):
#-------------------------------------------------------
# Sichern der Daten: aufgrund der Formularbearbeitung muss
# eine vollständige HTML-Seite zurückgeliefert werden!
# data_opl: Dictionary mit den gelieferten key-value-Paaren
# hier müsste man prüfen, ob die Daten korrekt vorliegen!
id_s = data_opl["id_s"]
data_a =[ data_opl["firmenname"]
, data_opl["branche"]
, data_opl["taetigkeit"]
, data_opl["sitz"]
, data_opl["anzahl"]
]
if id_s != "None":
# Update-Operation
self.db_o.update_px(id_s, data_a)
else:
# Create-Operation
id_s = self.db_o.create_px(data_a)
return self.createForm_p(id_s)
@cherrypy.expose
#-------------------------------------------------------
def delete(self, id):
#-------------------------------------------------------
# Eintrag löschen, dann Liste neu anzeigen
self.db_o.delete_px(id)
return self.createList_p()
@cherrypy.expose
#-------------------------------------------------------
def default(self, *arguments, **kwargs):
#-------------------------------------------------------
msg_s = "unbekannte Anforderung: " + \
str(arguments) + \
' ' + \
str(kwargs)
raise cherrypy.HTTPError(404, msg_s)
default.exposed = True
#-------------------------------------------------------
def createList_p(self):
#-------------------------------------------------------
data_o = self.db_o.read_px()
# mit diesen Daten Markup erzeugen
return self.view_o.createList_px(data_o)
#-------------------------------------------------------
def createForm_p(self, id_spl = None):
#-------------------------------------------------------
if id_spl != None:
data_o = self.db_o.read_px(id_spl)
else:
data_o = self.db_o.getDefault_px()
# mit diesen Daten Markup erzeugen
return self.view_o.createForm_px(id_spl, data_o)
# EOF
Code: Alles auswählen
# coding: utf-8
import os
import os.path
import codecs
import json
#----------------------------------------------------------
class Database_cl(object):
#----------------------------------------------------------
# da es hier nur darum geht, die Daten dauerhaft zu speichern,
# wird ein sehr einfacher Ansatz verwendet:
# - es können Daten zu genau 15 Teams gespeichert werden
# - je Team werden 2 Teilnehmer mit Namen, Vornamen und Matrikelnummer
# berücksichtigt
# - die Daten werden als eine JSON-Datei abgelegt
#-------------------------------------------------------
def __init__(self):
#-------------------------------------------------------
self.data_o = None
self.readData_p()
#-------------------------------------------------------
def create_px(self, data_opl):
#-------------------------------------------------------
# Überprüfung der Daten müsste ergänzt werden!
# 'freien' Platz suchen,
# falls vorhanden: belegen und Nummer des Platzes als Id zurückgeben
id_s = None
for loop_i in range(0,15):
if self.data_o[str(loop_i)][0] == '':
id_s = str(loop_i)
self.data_o[id_s] = data_opl
self.saveData_p()
break
return id_s
#-------------------------------------------------------
def read_px(self, id_spl = None):
#-------------------------------------------------------
# hier zur Vereinfachung:
# Aufruf ohne id: alle Einträge liefern
data_o = None
if id_spl == None:
data_o = self.data_o
else:
if id_spl in self.data_o:
data_o = self.data_o[id_spl]
return data_o
#-------------------------------------------------------
def update_px(self, id_spl, data_opl):
#-------------------------------------------------------
# Überprüfung der Daten müsste ergänzt werden!
status_b = False
if id_spl in self.data_o:
self.data_o[id_spl] = data_opl
self.saveData_p()
status_b = True
return status_b
#-------------------------------------------------------
def delete_px(self, id_spl):
#-------------------------------------------------------
status_b = False
if id_spl in self.data_o:
# hier müssen Sie den Code ergänzen
# Löschen als Zurücksetzen auf die Default-Werte implementieren
self.data_o[id_spl] = self.getDefault_px()
self.saveData_p()
status_b = True
#Ihr Ergänzung
return status_b
#-------------------------------------------------------
def getDefault_px(self):
#-------------------------------------------------------
return['','','','','','']
#-------------------------------------------------------
def readData_p(self):
#-------------------------------------------------------
try:
fp_o = codecs.open(os.path.join('data','webteams.json'),'r','utf-8')
except:
# Datei neu anlegen
self.data_o = {}
for loop_i in range(0,15):
self.data_o[str(loop_i)]=['','','','','','']
self.saveData_p()
else:
with fp_o:
self.data_o = json.load(fp_o)
return
#-------------------------------------------------------
def saveData_p(self):
#-------------------------------------------------------
with codecs.open(os.path.join('data','webteams.json'),'w','utf-8')as fp_o:
json.dump(self.data_o, fp_o)
# EOF
Code: Alles auswählen
# coding: utf-8
# sehr einfache Erzeugung des Markups für vollständige Seiten
# jeweils 3 Abschnitte:
# - begin
# - content
# - end
# bei der Liste wird der content-Abschnitt wiederholt
# beim Formular nicht
import codecs
import os.path
import string
#----------------------------------------------------------
class View_cl(object):
#----------------------------------------------------------
#-------------------------------------------------------
def __init__(self):
#-------------------------------------------------------
pass
#-------------------------------------------------------
def createList_px(self, data_opl):
#-------------------------------------------------------
# hier müsste noch eine Fehlerbehandlung ergänzt werden !
markup_s =''
markup_s += self.readFile_p('list0.tpl')
markupV_s = self.readFile_p('list1.tpl')
lineT_o = string.Template(markupV_s)
# mehrfach nutzen, um die einzelnen Zeilen der Tabelle zu erzeugen
for loop_i in range(0,15):
data_a = data_opl[str(loop_i)]
markup_s += lineT_o.safe_substitute (firmenname = data_a[0]
, branche = data_a[1]
, taetigkeit = data_a[2]
, sitz = data_a[3]
, anzahl = data_a[4]
, id_s = str(loop_i)
)
markup_s += self.readFile_p('list2.tpl')
return markup_s
#-------------------------------------------------------
def createForm_px(self, id_spl, data_opl):
#-------------------------------------------------------
# hier müsste noch eine Fehlerbehandlung ergänzt werden !
markup_s =''
markup_s += self.readFile_p('form0.tpl')
markupV_s = self.readFile_p('form1.tpl')
lineT_o = string.Template(markupV_s)
markup_s += lineT_o.safe_substitute (firmenname = data_opl[0]
, branche = data_opl[1]
, taetigkeit = data_opl[2]
, sitz = data_opl[3]
, anzahl = data_opl[4]
, id_s = id_spl
)
markup_s += self.readFile_p('form2.tpl')
return markup_s
#-------------------------------------------------------
def readFile_p(self, fileName_spl):
#-------------------------------------------------------
content_s =''
with codecs.open(os.path.join('template', fileName_spl),'r','utf-8')as fp_o:
content_s = fp_o.read()
return content_s
# EOF
[codebox=html5 file=Unbenannt.html]<!DOCTYPE html>
<html>
<head>
<title>Web-Teams</title>
<meta charset="UTF-8"/>
<style>
@import "/webteams.css";
</style>
<script type="text/javascript" src="/webteams.js"></script>
</head>
<body>
<h2>Anlegen eines neuen Datensatzes</h2>
<hr>
<form id="idWTForm" action="/save" method="POST">[/code]
Form1.tpl
[codebox=html5 file=Unbenannt.html]<input type= "hidden" value="$id_s" id="id_s" name="id_s"/>
<div>
<label for= "firmenname">Firmenname</label>
<input type="text" value="$firmenname" id="firmenname" name="firmenname" required/>
</div>
<div>
<label for="branche">Branche</label>
<input type="text" value="$branche" id="branche" name="branche" required/>
</div>
<div>
<label for="taetigkeit">Tätigkeit</label>
<input type="text" value="$taetigkeit" id="taetigkeit" name="taetigkeit" required/>
</div>
<div>
<label for= "sitz">Sitz</label>
<input type="text" value="$sitz" id="sitz" name="sitz" required/>
</div>
<div>
<label for="anzahl">Anzahl</label>
<input type="text" value="$anzahl" id="anzahl" name="anzahl" required/>
</div>
[/code]
Form2.tpl
[codebox=html5 file=Unbenannt.html] <div>
<input type="submit" value="Speichern" />
<a href="/" >Abbrechen<a/>
</div>
</form>
</body>
</html>[/code]
[codebox=html5 file=list0.tpl]
<!DOCTYPE html>
<html>
<head>
<title>Web-Teams</title>
<meta charset="UTF-8"/>
<style>
@import "/webteams.css";
@import "/style.css";
</style>
<script type="text/javascript" src="/webteams.js"></script>
</head>
<body>
<table>
<tr>
<th>Firmenname</th><th> Branche </th><th>Tätigkeitsschwerpunkt</th>
<th> Sitz </th><th> Anzahl Mitarbeiter</th>
<th>Aktion</th>
</tr>
[/code]
[codebox=html5 file=list1.tpl]<tr>
<td>$firmenname</td><td>$branche</td><td>$taetigkeit</td>
<td>$sitz</td><td>$anzahl</td>
<td><a href="/edit/$id_s">Bearbeiten</a> <a class="clDelete" href="/delete/$id_s">Löschen</a></td>
</tr>
[/code]
[codebox=html5 file=list2.tpl]
</table>
<div>
<form method = "GET" action ="/add">
<button type="submit">Erfassen</button>
</form>
</div>
</body>
</html>[/code]
Meine JASON-Datei ist recht simpel aufgebaut:
[codebox=j file=webteams.json]{"4": ["", "", "", "", ""], "12": ["", "", "", "", ""], "13": ["", "", "", "", ""], "3": ["", "", "", "", "", ""], "10": ["", "", "", "", ""], "0": ["dwd", "dwdwd", "wdwd", "dwdwd", "dwdw"], "2": ["test", "test", "test", "testtest", "test"], "11": ["", "", "", "", ""], "1": ["sadads", "asdasd", "asdsadsd", "asdsad", "asdsda"], "7": ["", "", "", "", ""], "6": ["", "", "", "", ""], "9": ["", "", "", "", "", ""], "8": ["", "", "", "", ""], "14": ["", "", "", "", "", ""], "5": ["", "", "", "", "", ""]}[/code]