Nicht den Newbie killen ;-) views und Python...

Django, Flask, Bottle, WSGI, CGI…
Narkosekroete
User
Beiträge: 7
Registriert: Freitag 31. März 2023, 16:56

Hallo geschätztes Forum,

bin nicht nur neu HIER sondern auch neu bei Pathon und Django. JA, mehrere neue Sachen auf einmal sind nicht immer einfach.
Nachdem ich mich jetzt seit ner Woche mit diversen tutorials beschäftigt habe versuche ich, meine ersten Schritte zu gehen. Dabei stoße ich aber wie Ihr Euch denken könnt ständig gegen stolpersteine....
Aktuell frage ich mich, warum ein konstrukt in der view einer App, welches SO aussieht:
def test_show(request):

test = Test.objects.all()
template = loader.get_template('drop_down/test.html')
context = ({'object_list': test})
return HttpResponse(template.render(context))
Prima in einem Template mit
<select id="test-select" name="test-select" class="form-select fw-bolder m-2" aria-label="test-select">
<option selected>wählen...</option>
{% for test in object_list %}
<option value="{{ test.id }}">{{ test.test }}</option>
{% endfor %}
</select>
angezeigt werden kann, aber wenn ich eine exakt zweit entität mit einem anderen Datenbankeintrag formuliere (ja, die view dazu defienire ich auch...auf das selbe template) dann kommt da nix an. Kommentiere ich die erste aus, dann geht's. Wo hängt da das problem ?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Bitte verwende Code-Tags nicht Quote-Tags, damit die Einrpckungen enthalten bleiben.
Und du musst schon das zeigen, was du versuchst, das nicht funktioniert. Die Beschreibung reicht nicht.
Narkosekroete
User
Beiträge: 7
Registriert: Freitag 31. März 2023, 16:56

Sorry....also nochmal von vorne:
wenn ich diesen Code laufen lasse, bekomme ich zwar keine Fehlermeldung:

views.py:

Code: Alles auswählen

def dienstgrad_show(request):

    dienstgrad = Dienstgrad_Anrede.objects.all()
    template = loader.get_template('drop_down/test.html')
    c = ({'object_list': dienstgrad})
    return HttpResponse(template.render(c))

def titel_show(request):

    titel = Titel.objects.all()
    template = loader.get_template('drop_down/test.html')
    c = ({'object_list': titel})
    return HttpResponse(template.render(c))
urls.py:

Code: Alles auswählen

urlpatterns = [
    # ex: /drop_down/
    path('test.html', views.dienstgrad_show, name='dienstgrad_show'),
    path('test.html', views.titel_show, name='titel_show'),
    ]
aber ich bekomme auf der template seite:

Code: Alles auswählen

<div class="col-2 m-1">

        <select id="dienstgrad-select" name="dienstgrad-select" class="form-select fw-bolder m-2" aria-label="dienstgrad-select">
        <option selected>wählen...</option>
            {% for dienstgrad in object_list %}
                 <option value="{{ dienstgrad.id }}">{{ dienstgrad.dienstgrad_anrede }}</option>
            {% endfor %}
        </select>

        <select id="titel-select" name="titel-select" class="form-select fw-bolder m-2" aria-label="titel-select">
        <option selected>wählen...</option>
            {% for titel in object_list %}
                 <option value="{{ titel.id }}">{{ titel.titel }}</option>
            {% endfor %}
        </select>

    </div>
nur für den ersten select tag eine drop down liste, die zweite ist leer. Warum ?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil eine Query die Resultate “lazy” erzeugt. Und danach leer ist. Du kannst das reparieren, indem du die Resultate im view in eine Liste überführst, und die a das Template übergibst.
Narkosekroete
User
Beiträge: 7
Registriert: Freitag 31. März 2023, 16:56

__deets__ hat geschrieben: Freitag 31. März 2023, 18:08 Weil eine Query die Resultate “lazy” erzeugt. Und danach leer ist. Du kannst das reparieren, indem du die Resultate im view in eine Liste überführst, und die a das Template übergibst.
Vielen Dank für die Anmerkung. Da sich die Jango-Doku aber nur in Englisch finden lässt und ausserdem solch konkrete Fragestellungen dann schwer zu finden sind: WIE :-P
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@deets: Das wird zwar lazy ausgeführt, ist aber bei einem zweiten Durchlauf nicht leer.

@Narkosekroete: Ich frage mich ja, ob das Falsschreiben von Namen ein Trollversuch ist.

Ich glaube, da ist ein grundsätzliches Verständnisproblem. Denkst du, dass "titel_show" jemals ausgeführt wird?
Und ich bin mir auch ziemlich sicher, dass das zweite Select-Feld nicht leer ist. "Dienstgrad" hat nur kein Value "titel".
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du bindest du gleiche Route an zwei Funktionen. Die zweite kann nicht erreicht werden, weil Django den ersten Treffer in der url.py nutzt.

Das `.html` bei der Route funktioniert zwar, ist aber... ungewöhnlich. Und eigentlich irreführend.

Ist das Absicht, dass du den "langen" Weg über den Template Loader und HttpResponse gehst statt `render`. Letzteres wird zumindest in der Django-Doku empfohlen.

Gruß, noisefloor
Narkosekroete
User
Beiträge: 7
Registriert: Freitag 31. März 2023, 16:56

letztlich gehts nicht um HttpResponse oder render oder welche anderen schicken Methoden noch zur Verfügung stehen. ich bin Anfänger und teste grad so bissl rum und mein Problem, weswegen ich geschrieben habe ist, wie kann ich in einer View mehrere Tabelleninhalte an ein Template übergeben ?

für EINE Tabelle ist das ja ziemlich einfach, schätze, es geht auch für mehrere einfach, aber da mache ich wohl einfach bei der Syntax immer was falsch...
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

dict(erster_schluessel=ding, zweiter_schluessel=anderes_ding) ist dafuer gedacht. Der Context kann eben mehrere Werte enthalten.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
weswegen ich geschrieben habe ist, wie kann ich in einer View mehrere Tabelleninhalte an ein Template übergeben ?
Nee, hast du nicht geschrieben. Die Frage war:
nur für den ersten select tag eine drop down liste, die zweite ist leer. Warum ?
Und die wurde beantwortet, von sparrow und von mir. Wenn dir da was nicht klar ist -> gerne nochmal hier nachfragen.

Zu "mehrere Inhalte": du kannst jedem Response ein Dictionary mitgeben, was beliebig viel Inhalt haben darf (das theoretische Limit ist halt dein RAM). Du musst halt nur jeden Inhalt (z.B. aus einer Datenbankabfrage) an einen eigenen Namen binden. Z.B:

Code: Alles auswählen

...
    dienstgrad = Dienstgrad_Anrede.objects.all()
    titel = Titel.objects.all()
    c = {'dienstgrad': dienstgrad, 'titel': titel}
   ...   
Im Template kannst du dann über die Schlüssel `dienstgrad` und `titel` auf die Werte darin zugreifen. Die Schlüssel kannst du benennen, wie du willst. Zwecks Verständlichkeit des Codes macht es i.d.R. aber schon Sinn, die Schlüssen so zu nennen wie die Variable, die das Ergebnis der DB Abfrage enthält.

Gruß, noisefloor
Narkosekroete
User
Beiträge: 7
Registriert: Freitag 31. März 2023, 16:56

__deets__ hat geschrieben: Montag 3. April 2023, 16:43 dict(erster_schluessel=ding, zweiter_schluessel=anderes_ding) ist dafuer gedacht. Der Context kann eben mehrere Werte enthalten.
Das war sicher hilfreich gemeint. Aber icherwähne nochmal, dass ich da abolsuter neuling bin und auch mit mister google mit dem schlagwort "dict" da nicht weitergekommen bin.
Mein problem ist ganz "einfach":
def test(request):

dienstgrad = Dienstgrad_Anrede.objects.all()
titel = Titel.objects.all()
facharztbezeichnung = Facharztbezeichnung.objects.all()
c= ({'object_list': facharztbezeichnung})
return render(request, 'test.html', c)
mit diesem code lese ich aus den tabellen dienstgrad, titel und facharztbezeichnung alle daten aus. und ich übergebe die werte der tabelle "facharztbzeichnung" an das template, wo sie auch im drop down dann auswählbar ist. Die FRAGE ist (nochmal) wie muß ich den Code anpassen, damit ich auch die diensgrad.objects.all und die titel.objects.all im template verwenden kann???
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wirklich nicht? Wenn ich "python dict" finde ich zB als ersten Treffer https://www.w3schools.com/python/python ... naries.asp - und da wird auch erklaert, dass dict(schluessel=wert) dem {"schluessel": wert} entspricht, das du schon benutzt.

Wenn du also mehrere Dinge uebergeben willst, dann muss der context (diesen Begriff hast du schon selbst benutzt) eben mehrere Werte enthalten. Kannn dict(wert=1, anderer_wert=2) sein, kann auch {"wert": 1, "anderer_wert": 2} sein. Das ist egal. Und fuer 1 und 2 koennen natuerlich auch deine Resultate angegeben werden.

Solche Grundlagen werden in diversen Tutorials erklaert, und so ganz ohne geht's nunmal nicht.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Die FRAGE ist (nochmal) wie muß ich den Code anpassen, damit ich auch die diensgrad.objects.all und die titel.objects.all im template verwenden kann???
Siehe meine vorherige Antwort.

BTW:
...und auch mit mister google mit dem schlagwort "dict" da nicht weitergekommen bin.
Ein dict oder in lang: Dictionary ist einer DER grundlegenden Datenstrukturen in Python. Wenn du da nicht sicher bist -> Django weglegen und nochmal das Grundlagentutorial durcharbeiten. Wenn du mit Django arbeitest musst du ein sicheres Grundverständnis von Python, Datenstrukturen, Funktionen und idealerweise auch Klassen in Python haben. Sind ist das für dich sehr sehr zu verstehen, was du da überhaupt treibst.

Gruß, noisefloor
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Narkosekroete: Schau mal ins Tutorial. Da gibt es einen guten Abschnitt zu Datenstrukturen. Das Verständis von Datenstrukturen ist fundamental in Python. Dir das Wissen anzueignen, kann dir niemand abnehmen.
Narkosekroete
User
Beiträge: 7
Registriert: Freitag 31. März 2023, 16:56

sparrow hat geschrieben: Montag 3. April 2023, 17:31 @Narkosekroete: Schau mal ins Tutorial. Da gibt es einen guten Abschnitt zu Datenstrukturen. Das Verständis von Datenstrukturen ist fundamental in Python. Dir das Wissen anzueignen, kann dir niemand abnehmen.
Hilfe zur selbsthilfe in allen Ehren. Aber mir ist schon klar, dass es auf der Welt jede Menge tutorials gibt. Und die maxime, in solchen Foren nicht jedem sofort seine coding-probleme zu lösen, sondern eher hilfe zur selbsthilfe zu geben ist mir auch geläufig. Unterm strich sage ich also danke für nix, denn ich bin 45, beschäftige mich seit langem mit allem möglichen IT zeug und brauche keinen Hinweis auf die URL mit dem Tutorial. ich wollte lediglich eine Antwort auf mein Problem. Dann mach ich halt ohne Euch weiter....
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
ich wollte lediglich eine Antwort auf mein Problem. Dann mach ich halt ohne Euch weiter....
Hast du bekommen. Mehrfach. Musst du halt nur Umsetzen, was im gegebenen Fall nicht weiter schwer ist, weil dir min 90% der Lösung gezeigt wurden.
denn ich bin 45, beschäftige mich seit langem mit allem möglichen IT zeug und brauche keinen Hinweis auf die URL
Ich bin ein paar Jahre älter, beschäftige mich mit IT Zeug seit dem C64 und freue mich auch heute noch über hilfreiche und interessante URLs.
Wenn du hingegen erwartest, dass dir hier genau der Code, den du gerne hättest, auf dem Silbertablett serviert wird... na ja, dann wird das halt nix hier. Viel Erfolg noch.

Gruß, noisefloor
Narkosekroete
User
Beiträge: 7
Registriert: Freitag 31. März 2023, 16:56

Dann sonnt Euch mal weiter in Eurer IT-Eröeuchtung....ich wollte ja keine fertig programmierte App von niemandem hier sondern nur eine hilfestellung für die korrekte Syntax. Aber wenn es eher angesagt ist, sich in seinem wissen zu sonnen und gönnerhaft links zu Tutorials zu posten...dann macht so weiter. aber ohne mich. Das ist nicht hilfreich für jemanden, der grad nicht weiter weiß. Tutorials habe ich genug ohne dieses Forum zu befragen, ich kann durchaus google bedienen....keine Ahnung, wozu das Forum hier dann gut sein soll, außer dass sich die etablierten selbst beweihräuchern können. machts gut!
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Joa. Quengler und Nachkarter braucht hier auch keiner. Also win win 👋
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

hast du viewtopic.php?p=418871#p418871 gelesen, inkl.dem Codebespiel, wo zwei Schlüssel im Dictionary angelegt werden? Hast du das verstanden? Das beantwortet 1:1 deine Frage. Wenn du es nicht verstanden hast -> frage konkret nach.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Narkosekroete: Es gibt jede Menge Tutorials, aber nur eine offizielle Dokumentation samt Tutorial von den Leuten, die Python-Programmiersprache entwickeln. Und das Tutorial sollte man mal durchgearbeitet haben. Das ist von Leuten die Python gut kennen, automatisiert getestet, dass heisst der Code der da drin steht, funktioniert, und es ist aktuell zu der Python-Version zu der die jeweilige Dokumentation ist. Irgendwo im Netz gefundene Tutorials können sehr unterschiedlicher Qualität sein, und teilweise auch veraltet bis uralt.

Bei Django gibt es auch eine gute umfangreiche Dokumentation und ein Tutorial, direkt vom Projekt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten