Seite 1 von 2

Mal wieder Probleme mit Django

Verfasst: Donnerstag 21. Februar 2008, 19:33
von klaus
Ich habe momentan wieder ein kleines Problem mit Django, bzw. eine Stelle, an der ich nicht weiterkomme. Wahrscheinlich ist es blos irgendein newbie-Fehler, den ich nur nicht sehe und ich hoffe, dass ihr mir deshalb helfen könnt.
Ich versuche auf einer Seite Ergebnisse einer Datenbanksuche darzustellen. Fürs erste würde es mir allerdings schon reichen, wenn ich es schaffen würde, alle Einträge anzuzeigen. Also, hier mal der Code, der dieses kühne Unternehmen :wink: bezwecken soll:

Die aufgerufene view-Funktion sieht folgendermaßen aus:

Code: Alles auswählen

from django.shortcuts import render_to_response
from ency.models import Trick

def all(request):
    jt_list = Trick.objects.all()
    return render_to_response('ency/search.htm', locals())

## ...
Das Template sieht folgendermaßen aus:

Code: Alles auswählen

{% extends "../juggl.htm" %}

{% block content %}
<h1>Suchergebnisse</h1>

<table>
<tr>
<td>Name:</td>
<td>Siteswap:</td>
<td>Level:</td>
<td>Requisiten:</td>
<td>Kategorie:</td>
</tr>
{% for jt in jt_list %}
<tr>
<td>{{ jt.name }}</td>
<td>{{ jt.swap }}</td>
<td>{{ jt.level }}</td>
<td>{{ jt.props }}</td>
<td>{{ jt.categ }}</td>
</tr>
{% endfor %}
</table>
{% endblock content %}
Als Fehlermeldung erhalte ich:
TypeError at /juggl/tricks/all/
'tuple' object is not callable

Ich hoffe, dass sich der Fehler in diesem Code befindet, wenn er fehlerfrei sein sollte, dann poste ich noch weitere wichtige Codestücke rein. Ich hoffe, dass ihr mir helfen könnt.

Verfasst: Freitag 22. Februar 2008, 19:17
von jens
ich würde nicht locales nehmen, sondern ein echtes context dict aufbauen... Poste mal den richtigen Traceback!

Verfasst: Freitag 22. Februar 2008, 20:07
von Leonidas
Du hast irgendwo die Built-in Funktion ``locals()`` mit einem Tupel überschrieben. Nun rate wo der Fehler ist ;)

Verfasst: Samstag 23. Februar 2008, 13:42
von klaus
@ Leonidas: Ich verstehe nicht ganz, was du meinst. Eine Funktion kann man doch nur überschreiben, indem man mit "def" eine neue Funktion definiert, die den gleichen Namen hat, aber doch nicht mit einem Tupel. Ich kann mich natürlich auch Täuschen, so gut kenne ich mich mit Python dann doch nicht aus, aber es würde mich sehr stark wundern.

Ich probiere dann mal den Weg, ein context dict zu fabrizieren, und hoffe, dass der klappt. Wenn nicht, melde ich mich noch mal und poste dann gleich den kompletten Traceback mit.

Verfasst: Samstag 23. Februar 2008, 13:59
von Leonidas
klaus hat geschrieben:@ Leonidas: Ich verstehe nicht ganz, was du meinst. Eine Funktion kann man doch nur überschreiben, indem man mit "def" eine neue Funktion definiert, die den gleichen Namen hat, aber doch nicht mit einem Tupel. Ich kann mich natürlich auch Täuschen, so gut kenne ich mich mit Python dann doch nicht aus, aber es würde mich sehr stark wundern.
Funktionen und "Variablen" sind im gleichen Namensraum und eigentlich auch das selbe (eine "Variable" ist ein Name der an ein Objekt gebunden ist, eine Funktion ist ein Name der an ein Funktionsobjekt gebunden ist, also eigentlich nur ein Sonderfall der "Variable"). Somit ist es absolut logisch. In einigen Lisp-Dialekten (ich glaube Common Lisp) ist das AFAIR anders, so dass Funktionen dort eigene Namensräume haben.

Alternativ kannst du, statt es mir nicht zu glauben, auch einfach ausprobieren.

Code: Alles auswählen

print locals()
def d():
    locals = (1, 2)
    locals()
d()

Verfasst: Samstag 23. Februar 2008, 14:20
von klaus
OK, wenn ich das in der Konsole eingebe erhalte ich ebenfalls einen TypeError. Allerdings weiß ich nicht, wo ich die Funktion locals() überschrieben haben soll. Ich habe in meinem kompletten Projekt keine Funktion, die locals irgendeinen Wert zuweist.

Verfasst: Samstag 23. Februar 2008, 14:48
von Leonidas
Dann mach mal in ``all()`` vor dem ``locals()`` ein ``print locals``, vielleicht wirds dann klarer was das ist.

Verfasst: Samstag 23. Februar 2008, 16:34
von klaus
Egal, ob ich ein "print locals" einfüge, oder nicht, solange ich die Funktion direkt in PyScripter aufrufe erhalte ich immer nur "True" als Ausgabe.

Verfasst: Samstag 23. Februar 2008, 17:36
von Leonidas
Django in einer IDE ausführen? Schlechte Idee.

Verfasst: Sonntag 24. Februar 2008, 20:27
von klaus
Wie soll ich es denn sonst ausführen? Nur über die Konsole, oder gibt es noch ne andere Lösung, bzw. wenn es schlecht ist, wenn ich es in einer IDE ausführe, wozu gibt es die dann.

Verfasst: Montag 25. Februar 2008, 08:30
von audax

Code: Alles auswählen

python manage.py runserver
So mach ich das immer ;)

Verfasst: Montag 25. Februar 2008, 08:47
von jens
Oder man baut sich einen kleine mini test app:
http://www.python-forum.de/topic-10600.html

Verfasst: Montag 25. Februar 2008, 17:11
von klaus
ähm, aber wenn ich es mit "python manage.py runserver" ausführe (wie ich das normalerweise auch mache, wenn ich die Seite testen will), dann sehe ich doch die "print"-Anweisungen nicht und um die ging es doch.

Verfasst: Montag 25. Februar 2008, 17:12
von jens
Doch, die print Ausgaben siehst du im Terminal.

Verfasst: Montag 25. Februar 2008, 17:13
von klaus
Du meinst mit Terminal schon die Eingabeaufforderung, oder?