Flask/Python Parameterübergabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ExxE
User
Beiträge: 5
Registriert: Donnerstag 25. Dezember 2014, 11:42

Hallo, ich habe ein kleines Problem

ich würde gerne in meiner Htmlseite, Parameter einer Funkion übergeben und wieder zurückbekommen.

meine Html Seite sieht folgend aus:

[code=html5 file='aWohnung.html]

{{ url_for( ' show_calender ', wohn_id = wohn.wohn_id) }} <!-- ruft das Programm show_calender(wohn_id) nicht auf-->

<th><a href="{{ url_for( 'show_calender', wohn_id = wohn.wohn_id) }}">zeigen</a></th> <!-- geht zwar wird aber nicht instant angezeigt, sonder muss geklickt werden -->

</th><th>{% autoescape off %}{{ calender2 }}{% endautoescape %}</th> <!--Ausgabe des veränderten Kalenders -->
[/code]

Mein Pythonprogramm:

Code: Alles auswählen

@app.route('/show_calender/<int:wohn_id>', methods=['GET', 'POST'])  #methods=['GET', 'POST'] in meinem Fall überflüssig?

def show_calender(wohn_id):                     #wohn_id ist zurzeit für nichts zuständig, werde es später für meine Datenbank brauchen
    myCal = Kalender(calendar.MONDAY)
    myCal = myCal.formatmonth(2014,12)

    return render_template('aWohnung.html', calender2=myCal)
Wie schaffe ich es url_for() so zu benutzen, dass es instant mein Kalender anzeigt, liegt es an der Syntax oder hab ich den falschen Return bei Python gewählt ?
BlackJack

@ExxE: Der Weg sieht irgendwie falsch aus. Man sollte da nicht versuchen ein gerendertes Template in ein anderes einzufügen sondern ein Template oder Makro verwenden und die Daten schon vorher berechnen und nicht erst aus dem Template eine kompizierte(re) Berechnung von Werten anzustossen. Das kehrt irgendwie die Verantwortlichkeiten um.
ExxE
User
Beiträge: 5
Registriert: Donnerstag 25. Dezember 2014, 11:42

Danke für deine Antwort, habe mich gerade über Makros schlau gemacht. Es würde Funktionieren wenn ich die komplette Datenbank übergeben würde (also schon eine Liste fertiger Kalender).

Um mein Problem zu verstehen müsste ich vielleicht weiter ausholen, ich arbeite an einer Verwaltungsseite von Ferienwohnungen.
Die Wohnungen können dynamisch erstellt und gelöscht werden (statisch wäre es kein Problem).

Bild

Da wo sich die leeren Kalender befinden (jeweils rechts vom Bild) sollten die Tage rot eingefärbt werden. Um dies zu erreichen bräuchte ich die jeweilige wohnungs_id.

Und es funktioniert ja auch, doch nur mit anklicken. Gibt es keine Möglichkeit es ohne klicken zu erstellen?

Ich hab nur Probleme mit der Identifizierung der Wohnungen.

Code: Alles auswählen


       {% for wohn in wohnungen %}                                                           <!-- schleife um über alle Wohnungen durchzugehen mit wohn als laufvariable -->

        <p></p>
    <table border="0" >
    <tr>
                {% if wohn.bild == None %}
                <tr><th><img src="/static/css/bilder/raum1.jpg" alt="MainKunde" height="200" width="300" ></th>

                <th>{% autoescape off %}{{ calender }}{% endautoescape %}</th>              <!-- das funktionier jedoch will ich die Kalender eindeutig identifizieren (wird gelöscht sobald ich ne Lösung                          j                                                                                                                                    finde -->

                  <th> {{ url_for( 'show_calender' , wohn_id = wohn.wohn_id ) }} </th>               <!--deshalb übergebe ich wohn_id Parameter funktionier aber nicht so, da nehme ich die falsche Funktion                     f                                                                                                                                     oder Syntax -->

                <th><a href="{{ url_for( 'show_calender' , wohn_id = wohn.wohn_id ) }}">zeigen</a></th>         <!-- so geht es aber man muss auf den link klicken, will aber es von Anfang an sehen.-->



        <th>{% autoescape off %}{{ calender2 }}{% endautoescape %}</th>                          <!-- hier wird das fertige Ergebnis stehen -->

     <th> Beschreibung:</th> <td> {{ wohn.beschreibung }} </td> </tr>                               <!-- der Rest ist uninteressant -->
                {% else %}
                <tr><th><img src="/static/css/bilder/raum2.jpg" alt="MainKunde" height="200" width="300" ></th></tr>
                {% endif %}
                <th> Wohn_id</th>
                <th>Personen</th>
                <th> Groesse</th>
                <th> Preis</th>
                <th> Bild</th>

                <th> Funktion</th>
                <th> Funktion 2</th>

            </tr>
            <ul>

     <tr>
                        <th>{{ wohn.wohn_id }}</th>
                        <th> {{ wohn.personen }} </th>
                        <th> {{ wohn.groesse }}</th>
                        <th> {{ wohn.preis }} </th>
                        <th> {{ wohn.bild }} </th>

                        <th><a href="{{ url_for('delete_wohnung', wohn_id=wohn.wohn_id) }}">Löschen</a></th>
                        <th><a href="{{ url_for('change_wohnung', wohn_id=wohn.wohn_id) }}">Update Wohnung</a></th>


     </tr>






            </table>
    {% endfor %}


gibt es da bessere Möglichkeiten, wie sollte man vorgehen?
BlackJack

@ExxE: Ich hab's mir jetzt nicht im Detail angeschaut aber: Ja Du müsstest *vorher* eine Datenstruktur mit allen Daten erstellen. Templates sind zum Anzeigen von Daten gedacht, der Template-Code dort sollte nicht teil des Programmflusses sein der erst ermittelt was angezeigt werden soll sondern ausschliesslich für die Formatierung/Generierung des HTMLs da sein.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@ExxE: wie BlackJack schon geschrieben hat, sollte {{calender}} irgendeine Art Makro sein, und nicht den HTML-Text vorformatiert da reinkopieren. Bestimmt kann man auch Iteratoren verwenden, wenn man nicht die ganzen Daten vorher sammeln will.
Antworten