Seite 1 von 4

Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 12:12
von meego
Warum funktioniert folgender Code nicht?

Code: Alles auswählen

@post('/erfassen')
def erfassen():
	roomtitle = request.forms.get('roomtitle')
	street = request.forms.get('street')
	return '<p>Wohungstitel: %s, Strasse: %s</p>' % roomtitle, street

Code: Alles auswählen

return '<p>Wohungstitel: %s, Strasse: %s</p>' % roomtitle, street
TypeError: not enough arguments for format string

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 13:18
von lackschuh
Hat ja nichts mit bottle zu tun...
Otherwise, values must be a tuple with exactly the number of items...
https://docs.python.org/2/library/stdty ... operations

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 15:14
von meego
Danke, wusste nicht, dass man für zwei Werte nur Tuples nehmen kann.

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 15:26
von jens
für Formulare nimmt man am besten eine lib. Aus verschiedenen gründen. U.a. Sicherheit und wegen fehleranzeige für den user...

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 15:33
von meego
WTForms? Was macht das konkret?

Ich möchte auch noch in einem Template eine Selektionsbox (die auf Tabellendaten zugreift) anzeigen. Ist es grundsätzlich richtig, wenn ich dazu eine Datenbankabfrage dem template als Dictionary übergebe?:

Code: Alles auswählen

@get('/art')
def art():
	result = SelectQuery(Housetype, Housetype.id, Housetype.housetype_de)
	dic = {}
   	for x in result:
   		dic.update({x.id : x.housetype_de})
	return template('unterkunft_art', dictionary=dic)

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 15:47
von jens
Egal welche lib man nimmt,sie sollte die Eingaben validieren. Z.b. das kein JS code oder SQL code drin ist.
Außerdem sollte sie Fehler dem user anzeigen. Z.b das eine Eingabe fehlt usw.

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 16:32
von meego
Hmm. Der User sendet das Form ausgefüllt ab. Sollte das Feedback nicht beim Ausfüllen erfolgen?

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 16:39
von BlackJack
@meego: Feedback beim ausfüllen ist okay, validieren auch, aber man muss auf jeden Fall auch auf dem Server validieren, denn es ist ja nicht garantiert das tatsächlich das Formular verwendet wurde. Von Benutzern kann unabsichtlich oder absichtlich *sonstwas* kommen.

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 18:35
von meego
Hi Blackjack

Verstehe. Okay, ich versuche mich einmal einzulesen.

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 20:30
von noisefloor
Hallo,

ich habe für so was in der Tat immer WTForms verwendet. Das war für mich zumindest 2011, als ich mich zuletzt tiefer damit beschäftigt habe, 1. Wahl.

Gruß, noisefloor

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 21:03
von Sirius3
@meego: Einzelne Einträge eines Wörterbuches setzt man nicht mit update sondern über den Indexzugriff mit eckigen Klammern. Normalerweise übergibt man der Template-Engine direkt das Query-Result, da direkt darüber iteriert werden kann.

Re: Bottle Formulare

Verfasst: Sonntag 26. Juli 2015, 22:15
von meego
Hallo
noisefloor hat geschrieben: ich habe für so was in der Tat immer WTForms verwendet. Das war für mich zumindest 2011, als ich mich zuletzt tiefer damit beschäftigt habe, 1. Wahl.
Geht Bootstrap damit immer noch?
Sirius3 hat geschrieben:@meego: Einzelne Einträge eines Wörterbuches setzt man nicht mit update sondern über den Indexzugriff mit eckigen Klammern. Normalerweise übergibt man der Template-Engine direkt das Query-Result, da direkt darüber iteriert werden kann.
Warum nicht und wie meinst du genau?

Elegant. Was macht man dann, wenn man zwei Sprachspalten hat (bzw. macht man dann für jede Sprache eine eigene Route und Query)?
Eine Schwäche meiner Version mit id | spaltentext ist aber: Wenn die Nutzer eine id selektiert haben kann man die Reihenfolge der Buttons nicht mehr ändern, bzw. die Buttons erscheinen in der Reihenfolge der id.

Re: Bottle Formulare

Verfasst: Montag 27. Juli 2015, 06:41
von noisefloor
Hallo,
meego hat geschrieben:Hallo
Geht Bootstrap damit immer noch?
??? - was meinst du damit?
meego hat geschrieben:
Sirius3 hat geschrieben:@meego: Einzelne Einträge eines Wörterbuches setzt man nicht mit update sondern über den Indexzugriff mit eckigen Klammern. Normalerweise übergibt man der Template-Engine direkt das Query-Result, da direkt darüber iteriert werden kann.
Warum nicht und wie meinst du genau?
1. So:

Code: Alles auswählen

my_dict = {}
my_dict['foo'] = 'bar'
my_dict['spam'] = 'egg'
Also ohne `update`.

2. Dem Tempate kein Dict über geben, sondern direkt das Query-Result (was ja in der Regel eine Liste von Listen ist bzw. sich genau so verhält) und im Template darüber iterieren. Das generieren des Dict ist ein überflüssiger Schritt.

Gruß, noisefloor

Re: Bottle Formulare

Verfasst: Montag 27. Juli 2015, 07:01
von Sirius3
meego hat geschrieben:Elegant. Was macht man dann, wenn man zwei Sprachspalten hat (bzw. macht man dann für jede Sprache eine eigene Route und Query)?
Eine Schwäche meiner Version mit id | spaltentext ist aber: Wenn die Nutzer eine id selektiert haben kann man die Reihenfolge der Buttons nicht mehr ändern, bzw. die Buttons erscheinen in der Reihenfolge der id.
Ich verstehe hiervon kein Wort? Was meinst Du mit Sprachspalten? Wo sind hier irgendwelche Buttons. Bitte mehr Kontext: Python-Code, Template, Datenbankdesign.

Re: Bottle Formulare

Verfasst: Montag 27. Juli 2015, 09:56
von meego
Hallo

Die DB Tabelle Wohnungsoptionen ist in der Form:

Code: Alles auswählen

ID | Text_de | Text_en | Text_fr
Für das deutsche Template frage ich in der Query also die ID und den deutschen Text ab, welcher im Template via Iteration über das Queryresultat die Formularbuttons bildet. Das Formular spreichert dann die ID der Wohnungsoption in der Wohnungstabelle (ForeignKey).

Benötige ich nun für jede Sprache eine eigene Route, Query und Template?

Re: Bottle Formulare

Verfasst: Montag 27. Juli 2015, 12:03
von BlackJack
@meego: Die Tabelle ist halt ungünstig aufgebaut. Die sollte eher (id, language, description) sein, mit `id` und `language` als zusammengesetzter Primärschlüssel, dann kann man ID und Sprache als Parameter bei der Suchanfrage verwenden. Andererseits würde ich so etwas nur machen wenn die Texte dort dynamisch über die Webseite eingegeben/erweitert werden. Falls es sich um Texte handelt die eher ”statisch” sind, gibt es ja schon andere, besser geeignete Vorgehen für i18n. Da würde ich mir mal das Babel-Package für Webanwendungen anschauen.

Re: Bottle Formulare

Verfasst: Montag 27. Juli 2015, 12:49
von Sirius3
@meego: wie man mit unterschiedlichen Sprachen umgeht, gibt es verschiedene Möglichkeiten. Der Browser sendet im Header die gewünschte Sprache des Benutzers mit ('Accept-Language'). Natürlich kann man die Sprache auch in die URL kodieren, wobei hier natürlich nicht verschieden Routen definiert werden, sondern eine Route mit einem Language-Platzhalter. Dann kann man die Sprache noch in Cookies, Sessions, oder Query-Strings übermitteln.

Re: Bottle Formulare

Verfasst: Montag 27. Juli 2015, 21:08
von meego
BlackJack hat geschrieben:@meego: Die Tabelle ist halt ungünstig aufgebaut. Die sollte eher (id, language, description) sein, mit `id` und `language` als zusammengesetzter Primärschlüssel, dann kann man ID und Sprache als Parameter bei der Suchanfrage verwenden. Andererseits würde ich so etwas nur machen wenn die Texte dort dynamisch über die Webseite eingegeben/erweitert werden. Falls es sich um Texte handelt die eher ”statisch” sind, gibt es ja schon andere, besser geeignete Vorgehen für i18n. Da würde ich mir mal das Babel-Package für Webanwendungen anschauen.
@BlackJack: Ich glaube dazu müsstest du schon ein Beispiel aufführen. Es hört sich nicht ganz einfach an. Babel sieht in der Doku eher nach kleineren Anpassungen aus (Datum/Währung).

@Sirius3: Sieht so aus, als ob ich das Problem erst einmal zurück stellen könnte. Vielleicht erst einmal mit einer Sprache anfangen.

Re: Bottle Formulare

Verfasst: Montag 27. Juli 2015, 21:14
von meego
Hallo
meego hat geschrieben:Hallo
Geht Bootstrap damit immer noch?
??? - was meinst du damit?
Dies hier: Link.

Code: Alles auswählen

my_dict = {}
my_dict['foo'] = 'bar'
my_dict['spam'] = 'egg'
Hat das weniger Ressourcenverbrauch?

LG

Re: Bottle Formulare

Verfasst: Montag 27. Juli 2015, 21:23
von BlackJack
@meego: Na Du hast halt nicht alle Sprachen zu einer ID in einem Datensatz sondern für jede ID und Sprache einen eigenen Datensatz.

Code: Alles auswählen

1 en House
1 de Haus
2 en Car
2 de Auto
Bei der Babeldokumentation hast Du dann wohl nicht gründlich genug gelesen.

Der Wörterbuchzugriff ist keine Frage des Ressoucenverbrauchs — obwohl die direkte Zuweisung eines Wertes natürlich etwas weniger Speicher und Rechenzeit benötigt als das erstellen eines neuen Wörterbuchs mit nur *einem* Schlüssel/Wert-Paar, nur um damit dann `update()` aufzurufen — sondern ob man unsinnigen, zu komplizierten Code schreibt, oder den genau für diesen Fall vorgesehenen.