python in django nutzen

Django, Flask, Bottle, WSGI, CGI…
setiinch
User
Beiträge: 13
Registriert: Samstag 11. Februar 2017, 14:54

Hallo,

versuche mich gerade in Django einzuarbeiten und habe folgendes Problem, dass ich Python code nicht direkt nutzen kann.

Code: Alles auswählen

def seite1(request):

    wert3 = {"abc":[1,2,3]}
    wert1 = 1
    wert2 = 5
    wert4 = wert1 + wert2


    return render(request,'seite1.html', wert4)
hatte mit die Funktion in der view.py erstellt und wollte mir das Ergebnis wert4 auf der seite1.html ausgeben lassen.
Hat jem eine Idee wie man das Umsetzen kann ?

mfg
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du das entsprechende Kapitel über Templates in der Django-Dokumentation gelesen?
setiinch
User
Beiträge: 13
Registriert: Samstag 11. Februar 2017, 14:54

Ich nehme an das bedeutet sowas funktioniert nicht in Django ? Ka welches Kapital genau meinst du?
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@setiinch: Was heisst denn das kannst Du nicht nutzen? Was passiert denn? Und was hättest Du erwartet das da passiert? Was erwartet `render()` als drittes Argument?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
setiinch
User
Beiträge: 13
Registriert: Samstag 11. Februar 2017, 14:54

hallo,

also ich hättte vermutet das der wert4 als ergebnis auf der seite1.html ausgeben wird in dem ich {{wert4}} in den html einbinden. Das Problem ist aber schon ,dass er den Wert1 = 1 nicht als Variable deklariert und mir ein Fehler wirft. Was aber funktioniert ist das er Listen als Objekte erkennt und ausgibt. :?: . Fazit: Python Variablen kann man nicht definieren aber Listen. Also wie kann man Werte berechnen lassen im backend oder muss man javascript dafür verwenden ?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn da ein Fehler kommt, wie sieht er exakt aus, inklusive vollständigem Traceback?
Praktisch wäre dann auch noch zu wissen, wie das Template aussieht.
Die Dokumentation zu render: https://docs.djangoproject.com/en/3.0/t ... shortcuts/
Und in Kapitel 3 wird das alles erklärt: https://docs.djangoproject.com/en/3.0/intro/tutorial03/
setiinch
User
Beiträge: 13
Registriert: Samstag 11. Februar 2017, 14:54

Hallo,

also der Fehler wäre :

TypeError at /seite1/

context must be a dict rather than int.

was für mich bedeutet, dass keine int Variablen zugelassen werden, sondern das er nur dict Objekte zulässt. Was mich verwundert das Python Code sehr start im Django Framework eingeschränkt ist oder liege ich da falsch ?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du das Tutorial gelesen. Dann sollte Dir eigentlich klar sein, warum da ein Wörterbuch erwartet wird. Wie soll den das Template wissen, das irgendwo anders eine Variable wert4 heißt, wo es duch nur ein Int mit dem Wert 6 sieht?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

setiinch hat geschrieben: Sonntag 29. März 2020, 11:28 Was mich verwundert das Python Code sehr start im Django Framework eingeschränkt ist oder liege ich da falsch ?
Ja, da liegst Du völlig falsch. Django legt Dir keine Restriktionen auf, ist aber ein Tool, das korrekt genutzt werden muss (so wie alle anderen Tools auch).

Natürlich kann man versuchen, sich Django, statt mit Lesen der Dokumentation, mit Ausprobieren zu nähern. Das wird dann aber recht schnell sehr frustrierend.

Sowohl in der Doku als auch in der Fehlermeldung steht, dass als dritter Parameter für render ein Dictionary erwartet wird. Das ergibt auch Sinn, denn schließlich soll die Möglichkeit bestehen, Templates mit vielen und komplexen Daten zu befüllen.

In Jahren gewachsene Lösungen ziehen sich durch das ganze Framework durch. Der beste Einstieg ist das Tutorial, dann kleine eigene Projekte um die Dokumentation zu erforschen, sowie die Basics aus eigener Kraft verstehen zu lernen. Die Einarbeitung in ein Framework kostet immer Zeit – und das ist bei Django nicht anders.
setiinch
User
Beiträge: 13
Registriert: Samstag 11. Februar 2017, 14:54

Hallo,

ich wollte nur Wissen wie man "Basic" Python Code ins Django Framework intigieren kann! Vllt hatte jem mal das selbe Problem. Das mit den 2 Werten summieren war ja nur ein Beispiel. Ich hatte ein Ansatz gepostet der nicht funktioniert, daher wollte ich nur wissen ob es jem auch schon versucht hat und mir helfen kann. In den Tutorials hab ich nix dazugefunden dewegen hab ich die Frage hier gepostet.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Im Tutorial gibt es genug funktionierende Beispiele. Der Unterschied zwischen den Beispielen und dem, was Du hier machst, wurde Dir jetzt nun schon mehrfach gesagt: Der dritte Parameter muß ein Wörterbuch sein, damit das Template auch weiß, welchem Wert welcher Name zuzuordnen ist.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@setiinch: Die Formulierung „Python Code ins Django Framework intigrieren [sic]“ ist sehr komisch. Das ist ja selbst in Python geschrieben und man integriert da keinen Code sondern schreibt halt Code der das Rahmenwerk *benutzt*. Und das tut man in dem man die angebotene API so benutzt wie das in der Dokumentation steht. Und da steht laut und deutlich, dass das dritte Argument ein Wörterbuch sein muss. Wahrscheinlich geht auch jedes andere Objekt das wie ein Wörterbuch Schlüssel auf Werte abbildet, aber eben keine ganze Zahl. Wie würdest Du die denn auch im Template dann ansprechen wollen? Welchen Namen würdest Du dafür denn als Platzhalter ins Template schreiben wollen?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
setiinch
User
Beiträge: 13
Registriert: Samstag 11. Februar 2017, 14:54

So hab es für mich jetzt so gelöst:

Code: Alles auswählen

def seite1(request):
    wert4 = 34
    wert5 = 101
    sum = wert4 + wert5
    wert3 = {"abc":[sum]}

    return render(request,'seite1.html', wert3)
auf Seite1.html dann einfach

Code: Alles auswählen

{{abc}}
hinzufügen fertig

Danke für die Hilfe.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
So hab es für mich jetzt so gelöst:
Das ist nicht nur "für dich", so muss man das machen. Wie oben schon mehrfach gesagt wurde: als 3. Argument erwartet Django ein Dict, in dem die Schlüssel-Werte Paare für das Template drin stehen. Das wird immer erwartet. Auch, wenn du nur einen Wert übergibst.

Die Zeile 3+4 kannst du auch zusammen ziehen:

Code: Alles auswählen

>>> a=1
>>> b=2
>>> c={'foo': a+b}
>>> c
{'foo': 3}
>>> 
`sum` ist als Variablename schlecht, weil du damit die Build-in Funktion `sum` überschreibst, was zu ungewollten Nebeneffekten führen kann.

Gruß, noisefloor
setiinch
User
Beiträge: 13
Registriert: Samstag 11. Februar 2017, 14:54

@noisefloor Wie man ein Dict Objekt erstellt weiß ich auch. Es ging darum wie man Werte von Variablen in Django ausgibt und dazu hab ich in der Doku nix dazu gefunden.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@setiinch: Das steht dort aber. Und so ganz richtig machst Du es auch nicht, denn Du gibst da ja nicht einen einzelnen Wert aus sondern eine Liste mit einem Wert, wo man sich dann fragen muss warum Du *einen* Wert in eine Liste steckst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

setiinch hat geschrieben: Sonntag 29. März 2020, 21:13 Es ging darum wie man Werte von Variablen in Django ausgibt und dazu hab ich in der Doku nix dazu gefunden.
Geh mal das offizielle Django-Tutorial durch. Dort findest du in Teil 3 beim entsprechenden Code den Text: "The context is a dictionary mapping template variable names to Python objects." Im Kontext des Tutorials sollte dann völlig klar sein, was gemeint ist.

Direkt bei render ist auch noch eine ausführliche Erklärung. Die setzt dann allerdings voraus, dass man sich mit Templates auskennt (im Zweifelsfall einfach den entsprechenden Links in der Dokumentation folgen).
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@setiinch: es steht zwar oben schon mal, aber ich wiederhole es gerne noch mal, weil wichtig: es ist bei Django essentiell, die Doku / das Tutorial _genau_ und _in_Ruhe_ zu lesen. Grund: a) ist es sehr gut und b) ist Django zu umfangreich, um da mit Trial & Error Methoden weiter zu kommen.

Was ich dir auch empfehlen kann, weil ebenfalls ein sehr gutes Tutorial: "Django for Girls" (kann man auch als Boy lesen...). Die Kombination aus dem Tutorial mit dem offiziellen Django Tutorial hat mir zumindest damals sehr geholfen, mein erstes Django-Projekt erfolgreich zum laufen zu bringen.

Gruß, noisefloor
setiinch
User
Beiträge: 13
Registriert: Samstag 11. Februar 2017, 14:54

Du *einen* Wert in eine Liste steckst.
Welchen Vorschlag hast du den, um "einen" INT Wert auszugeben.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Die offensichtliche Lösung hat noisefloor doch schon gepostet:

Code: Alles auswählen

return render(request, 'seite1.html', {"abc": wert4 + wert5})
Antworten