Bottle Formulare
@meego: Nee, ich denke gettext & Co sind nicht mal eben in zwei Sätzen erklärt. Das ist ja auch ein kompliziertes Thema. Die meisten Leute kennen ja nur zwei, drei Sprachen und haben keine Ahnung was es alles an Regeln und Ausnahmen in anderen Sprachen geben kann, zum Beispiel was Ein- und Mehrzahl angeht bzw. dass das bei einigen Sprachen gar keine binäre Sache ist, sondern das da noch mehr unterschieden wird.
@meego: Zum einen weil ORMs nicht wissen wo die Daten herkommen und bei vielen ”Quellen” bereits Mechanismen zur Validierung bereitstehen und auf der anderen Seite auch auf der Seite der Datenbank über CONSTRAINT Prüfungen möglich sind, Spezielle (NOT NULL, UNIQUE, PRIMARY KEY) oder auch allgemein formulierbare mit CHECK.
Ausserdem bietet SQLAlchemy beispielsweise durchaus die Möglichkeit über den `sqlalchemy.orm.validates()`-Dekorator Methoden zur Validierung von Attributwerten zu schreiben.
Ausserdem bietet SQLAlchemy beispielsweise durchaus die Möglichkeit über den `sqlalchemy.orm.validates()`-Dekorator Methoden zur Validierung von Attributwerten zu schreiben.
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Und der Vollständigkeit halber sei noch angemerkt, dass Django i18n ootb unterstützt.
Gruß, noisefloor
In WTForms zu validieren hat außerdem den Vorteil, dass WTForms bei Fehlern in der Validierung direkt ein neues Formular inkl. Fehlerausgabe generien kann - das kann ein ORM halt nicht, weil's eine Ebene tiefer sitzt.meego hat geschrieben:Wieso stellen ORMs eigentlich nicht selber Methoden für die Validationsprüfung zur Verfügung?
Alsp ich würde das ganze schon mal an einer Mini-Applikation (muss ja nicht unbedingt dein Immobilien-Projekt sein) üben, damit du siehst, wie das funktioniert. Außerdem könnte es ja auch sein, dass du damit überhaupt nicht klar kommst, was wiederum einfluss auf den Entwurf den Applikation / Datenbank haben könnten.meego hat geschrieben:Kurze Rede, langer Sinn: Du empfiehlst mir die Tabelle erst einmal auf id/deutscher Text zu beschränken und mich dann später um Sprachen zu kümmern..
Und der Vollständigkeit halber sei noch angemerkt, dass Django i18n ootb unterstützt.
Gruß, noisefloor
Übersetzung: Wenn du Django benutzen würdest, wie seit Wochen empfohlen, müsstest du auch das Rad "Verwaltung übersetzter Texte" nicht neu erfinden.noisefloor hat geschrieben:Und der Vollständigkeit halber sei noch angemerkt, dass Django i18n ootb unterstützt.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Gibt auch ein paar django apps: https://www.djangopackages.com/grids/g/i18n/
i18n ist halt auch ein komplexes Thema...
i18n ist halt auch ein komplexes Thema...
Hallo
Es könnte diese Methoden vielleicht auch implementieren und selber die Formularfelder erzeugen..In WTForms zu validieren hat außerdem den Vorteil, dass WTForms bei Fehlern in der Validierung direkt ein neues Formular inkl. Fehlerausgabe generien kann - das kann ein ORM halt nicht, weil's eine Ebene tiefer sitzt.
Will ich auch nicht. Und dafür müsste ich dann vermutlich erst einmal ein halbes Jahr lang das wesentlich unintuitivere Django erlernen, um überhaupt etwas damit anstellen zu können.Übersetzung: Wenn du Django benutzen würdest, wie seit Wochen empfohlen, müsstest du auch das Rad "Verwaltung übersetzter Texte" nicht neu erfinden.
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
EDIT: bezieht das "Es" auf das ORM?
Gruß, noisefloor
Äh... heißt was genau? Verstehe ich gerade nicht.meego hat geschrieben:Es könnte diese Methoden vielleicht auch implementieren und selber die Formularfelder erzeugen..
EDIT: bezieht das "Es" auf das ORM?
Gruß, noisefloor
Hi
Ja, soweit ich den WTF-Crashkurs bis jetzt verstanden habe, erzeugt man damit ja dann auch über Widget irgendwelche Felder fürs Template.noisefloor hat geschrieben:meego hat geschrieben: EDIT: bezieht das "Es" auf das ORM?
Gruß, noisefloor
Was heisst das? Ist direkt aus dem WTF-Crashkurs übernommen:
Code: Alles auswählen
housetype = IntegerField('Art des Hauses', [validators.NumberRange(min=1, max=30, message=_(u'Bitte wähle ein Haus aus.'))])
NameError: name '_' is not defined
@meego: Das ist schon wieder so eine absolute Grundlage, die wir zudem auch schon mal hatten: Wenn man einen Namen verwendet, dann muss der vorher irgendwo definiert werden. Das ist auch beim Namen `_` nicht anders. Offenbar benutzen die das im „Crash Course“ ohne es vorher irgendwo einzuführen. Das ist konventionell ein Name unter den man `gettext.gettext()` importiert.
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@meego: ein ORM is halt ein ORM und kein Formular-Framework. Genau soc wie z.B. WTForm nichts in eine Datenbank schreibt. Oder anders: für jeden Job das passende Tool.
Der Vollständigkeit halber sei noch gesagt, dass:
* es für WTForms eine Extension gibt, die das SQLAlchemy-Modellen Formulare generieren kann
* Django kann aus Modellen seinem ORM auch Formulare generieren, und zwar mit 4 kurzen Zeilen Code
Gruß, noisefloor
@meego: ein ORM is halt ein ORM und kein Formular-Framework. Genau soc wie z.B. WTForm nichts in eine Datenbank schreibt. Oder anders: für jeden Job das passende Tool.
Genau. Du definierst auf dem pythonischen Weg Klasse, aus denen du später im Template die Formularfelder renderst. Der eigentliche Vorteile ist aber die Validierung und das du dich später nicht mit dem HTML und dem extrahieren der Formulardaten aus den POST-Daten rumschlagen musst.Ja, soweit ich den WTF-Crashkurs bis jetzt verstanden habe, erzeugt man damit ja dann auch über Widget irgendwelche Felder fürs Template.
Der Vollständigkeit halber sei noch gesagt, dass:
* es für WTForms eine Extension gibt, die das SQLAlchemy-Modellen Formulare generieren kann
* Django kann aus Modellen seinem ORM auch Formulare generieren, und zwar mit 4 kurzen Zeilen Code
Gruß, noisefloor
Was ist gettext? Und wie lautet der im Tutorial vermisste Import-Befehl konkret?BlackJack hat geschrieben:@meego: Das ist schon wieder so eine absolute Grundlage, die wir zudem auch schon mal hatten: Wenn man einen Namen verwendet, dann muss der vorher irgendwo definiert werden. Das ist auch beim Namen `_` nicht anders. Offenbar benutzen die das im „Crash Course“ ohne es vorher irgendwo einzuführen. Das ist konventionell ein Name unter den man `gettext.gettext()` importiert.
Hallo noisefloor
Muss man bei Bottle das Objekt request eigentlich auch so der Funktion unter der Route übergeben? Bis jetzt war das nicht nötig. Bis jetzt musste ich über request.forms.GET die Formulardaten abrufen.
Ist das nicht auch extrahieren:noisefloor hat geschrieben:.. und dem extrahieren der Formulardaten aus den POST-Daten rumschlagen musst.
Code: Alles auswählen
def register(request):
form = RegistrationForm(request.POST)
if request.method == 'POST' and form.validate():
user = User()
user.username = form.username.data
user.email = form.email.data
user.save()
redirect('register')
return render_response('register.html', form=form)
Und wenn man dann nicht alle Felder der Tabelle füllt?* es für WTForms eine Extension gibt, die das SQLAlchemy-Modellen Formulare generieren kann
* Django kann aus Modellen seinem ORM auch Formulare generieren, und zwar mit 4 kurzen Zeilen Code
@meego: `gettext` ist ein Modul in der Standardbibliothek. Den konkreten Import kann ich Dir nicht sagen, weil das davon abhängt wie man `gettext` verwenden will. Man kann die Funktion `gettext()` (oder eine der Variationen davon) an den Namen binden, oder man kann ein „translation“-Objekt erstellen und dessen `gettext()`-Methode (oder eine der Variationen davon) an den Namen binden, oder — und das ist bei Webanwendungen wahrscheinlich vorzuziehen — man verwendet dessen `ugettext()`-Methode (oder eine der Variationen davon). Man kann aber auch mit der `install()`-Methode eine der `*gettext()`-Methoden wirklich global installieren.
Es kann aber auch sein das man `gettext` gar nicht direkt verwenden will sondern eine weitere Bibliothek dazwischen schaltet und dessen `gettext()`-Äquivalent verwenden möchte.
Dazu muss man sich mal mit diesem ganzen Thema auseinandersetzen, und das wird Zeit beanspruchen. Sowohl was das einlesen in i18n mit Gettext & Co allgemein betrifft, also abseits von Python, denn dieses System wird ja auch bei anderen Programmiersprachen eingesetzt, als auch konkret mal mit dem entsprechenden Python-Modul(en). Und natürlich müsste man sich in die Werkzeuge einarbeiten die es zum Bearbeiten der Übersetzungen gibt. So ein paar Tage nur für dieses Thema sollte man schon einplanen.
Bei Deinem `User`-Beispiel sind das ja beides Textfelder, das wäre auch ohne WTForms nicht so viel mehr Arbeit. Aber bei anderen Feldarten käme noch die Konvertierung in den entsprechenden Datentyp, und natürlich die Validierung hinzu. Bei der E-Mail-Adresse könnte man beispielsweise prüfen ob da überhaupt etwas drin steht, und mindestens ob ein '@' enthalten ist.
Es kann aber auch sein das man `gettext` gar nicht direkt verwenden will sondern eine weitere Bibliothek dazwischen schaltet und dessen `gettext()`-Äquivalent verwenden möchte.
Dazu muss man sich mal mit diesem ganzen Thema auseinandersetzen, und das wird Zeit beanspruchen. Sowohl was das einlesen in i18n mit Gettext & Co allgemein betrifft, also abseits von Python, denn dieses System wird ja auch bei anderen Programmiersprachen eingesetzt, als auch konkret mal mit dem entsprechenden Python-Modul(en). Und natürlich müsste man sich in die Werkzeuge einarbeiten die es zum Bearbeiten der Übersetzungen gibt. So ein paar Tage nur für dieses Thema sollte man schon einplanen.
Bei Deinem `User`-Beispiel sind das ja beides Textfelder, das wäre auch ohne WTForms nicht so viel mehr Arbeit. Aber bei anderen Feldarten käme noch die Konvertierung in den entsprechenden Datentyp, und natürlich die Validierung hinzu. Bei der E-Mail-Adresse könnte man beispielsweise prüfen ob da überhaupt etwas drin steht, und mindestens ob ein '@' enthalten ist.
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Am besten suchst du dir mal ein paar Webseiten die erklären, wie du die POST / Formular-Daten unter Bottle an WTForms übergibst.
Gruß, noisefloor
Nein, das funktioniert so nicht unter Bottle. Wie in der WTForms Doku steht, sind die meisten Beispiele Pseudo-Code, der an die Syntax von Django angelehnt ist.Muss man bei Bottle das Objekt request eigentlich auch so der Funktion unter der Route übergeben?
Am besten suchst du dir mal ein paar Webseiten die erklären, wie du die POST / Formular-Daten unter Bottle an WTForms übergibst.
Zumal bei Django das Zusammenspiel von ORM, Templates und Formularframework klar ist - da muss man sich halt nicht wie bei Bottle + PeeWee + WTForms um's zusammenspiel kümmern. Bei ich ja wie gesagt auch eine "alte" Applikation mit Bottle + WTForms + SQLAlchemy habe - das ist auch kein Hexenwerk. Aber es ist mit Django IMHO einfacher und schneller.Ich glaube django wäre besser für dich, weil in der Dokumentation viele fragen schon geklärt werden...
Gruß, noisefloor
BlackJack hat geschrieben:@meego: `gettext` ist ein Modul in der Standardbibliothek. Den konkreten Import kann ich Dir nicht sagen, weil das davon abhängt wie man `gettext` verwenden will. Man kann die Funktion `gettext()` (oder eine der Variationen davon) an den Namen binden, oder man kann ein „translation“-Objekt erstellen und dessen `gettext()`-Methode (oder eine der Variationen davon) an den Namen binden, oder — und das ist bei Webanwendungen wahrscheinlich vorzuziehen — man verwendet dessen `ugettext()`-Methode (oder eine der Variationen davon). Man kann aber auch mit der `install()`-Methode eine der `*gettext()`-Methoden wirklich global installieren.
Klingt kompliziert. Ist Babel eine Konkurrenz zu gettext? Ich könnte den Unterstrich vielleicht auch erst einmal weglassen?