Django: Problem bei Get- / Postmethoden im Adminbereich

Django, Flask, Bottle, WSGI, CGI…
Antworten
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

Grüßt euch,
ich habe im Adminbereich eine Seite (als Beispiel TEST) wo ich per Ajax ein HTML Formular aufrufe. Dieses schicke ich an ...admin/Test/test/ per method="get" in meinem Formular.
1. Problem was mir aufgefallen ist, dass wenn ich nach dem Formular auf der Seite lande am Ende folgendes steht ( ...admin/Test/test/?e=1), was bedeutet das?
Hänge ich aus spaß an das action im Formular einfach eine nicht vorhandene Seite an kommt klar eine Fehlermeldung da es die Seite nicht gibt, aber ich habe in der URL meine Getparameter stehen! Warum das ist weiß ich nicht... aber es sagt mir, dass es eig. funktioniert!
2. Klar funktioniert dann wenn ich nichts bekomme natürlich in der admin.py von Test meine function nicht die ich per

Code: Alles auswählen

if request.method == 'GET':
aufrufe. Da fällt mir dann auf dass er auf Test garkein get bekommt... aber warum auf der nicht vorhandenen Seite?

Kann es sein, dass ich Django sagen soll, dass er im Adminbereich GET und POST Methoden zulassen soll? Aber Django arbeitet doch nur damit darum wunder ich mich...

Danke und Gruß Chris
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Du willst dein Problem nochmals beschreiben, ich versteh nur Bahnhof ;) + Codebeispiele
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

Kein Problem,
also: Im Adminbereich unter Spiele liste ich alle meine Spiele auf wo ich eine Dropdownliste habe. Wähle ich ein bestimmtes Feld in der Liste aus rufe ich ein Ajax/HTML Fenster auf. In dem Fenster habe ich 2 Tabellen mit Daten aus Django gefüllt. Per "GET" Methode auf dem "OK" Button sende ich dann den ausgewählten Inhalt an Django und möchte meine Spiele anhand der gesendeten Daten der "GET" Methode durchsuchen.
(Ich wähle aus Tabelle1: 4 Spieler, Alter von 6-99 und aus Tabelle2: kein Brettspiel aus. Also versuche ich später die Spiele mit Punkten aus Tabelle1 anzeigen zu lassen und die dann nochmal zu filtern aus den Punkten von Tabelle2) Django ignoriert aber leider die "GET" Methode... "POST" klappt auch nicht. Sende ich das ganze nicht an die Spieleseite sondern an eine Seite die es in Django eig. garnicht gibt bekomme ich in der Adressleiste des Webbrowser auf einmal die Einträge aus Tabelle1 und Tabelle2. Warum macht er das nicht in der Spieleseite? Aber auf einer Seite die es garnicht gibt...

Sollte Django doch die Werte an die Seite schicken hatte ich mir folgenden Quellcode geschrieben in der admin.py von Spiele:

Code: Alles auswählen

def queryset(self, request):
    qs = super(CompanyAdmin, self).queryset(request)
    if request.method == 'GET':
        ein = REQUEST["id_ein"]
        aus = REQUEST["id_aus"]
        einliste = ein.split(',')
        ausliste = aus.split(',')
        qs.filter(pk__in=einliste).exclude(pk__in=ausliste)
    return qs
Hier fange ich die dann gesendete "GET" Methode ab und verarbeite die 2 Tabellen id_ein und id_aus. Im Filter versuche ich dann meine Ansichtsseite zu verändern, dass ich dann nicht alle Spiele zu sehen bekomme sondern halt die gefilterten Spiele.

Ich hoffe ich habs verständlich hin bekommen :-)
Benutzeravatar
draci
User
Beiträge: 53
Registriert: Dienstag 26. September 2006, 18:13

@csc
Wie sieht den dein Formular Code (HTML) aus ?
Benutzt du name= in den <input ...> Tags ?
(Das war bei mir mal der Fehler :P )
Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect. - Linus Torvalds

[url]http://groups.google.com/group/pt.comp.so.linux/msg/9eb7db59e32fe08a[/url]

[url=http://www.tty1.net/smart-questions_de.html]Wie man richtig Fragen stellt[/url]
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

Code: Alles auswählen

def tag_search(request):
    message = request.GET.get('key')
    if(message == 'Spiel'):
        c = '<form name="tagform" method="get" action="/admin/Spieler/spieler/"><p style="margin-left:50px;text-align:left;"></p>'
        a = SpielSearchFormEin()
        b = SpielSearchFormAus()
        b = c+'<div style="margin-left:50px;margin-right:<40px;text-align:left;">'+a.as_table()+'</div><div style="margin-left:50px;
        margin-right:<40px;text-align:left;">'+b.as_table()+'</div><br/><input type="submit" value="Ok"/></form>'        
    return HttpResponse(b, mimetype="text/html")
So sieht das Formular aus, ich verstehe aber nicht was du da falsch gemacht hast :D
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

Ich meine vielleicht habt ihr ja schon so eine Ausschlusssuche für mich? Die einfach Müller Maier Schmitz suchen soll aber nicht die aus Hamburg und Köln kommen...
Benutzeravatar
draci
User
Beiträge: 53
Registriert: Dienstag 26. September 2006, 18:13

Hmm mich hätte jetzt mehr der Quellcode im Browser interessiert.
Zu meinem Fehler: Ich war faul und hab im Source eines gerenderten Formulars die <input> tags abgeschrieben.
Da dieser aber kein name attribut hatten, funktionierten sie mit GET nicht.
z.B.

Code: Alles auswählen

<input type="text name="test">
wird beim absenden zu ?test=wert in der url
Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect. - Linus Torvalds

[url]http://groups.google.com/group/pt.comp.so.linux/msg/9eb7db59e32fe08a[/url]

[url=http://www.tty1.net/smart-questions_de.html]Wie man richtig Fragen stellt[/url]
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

Achso, ne die Rückgabefelde die ich mir im Seitenquelltext anzeigen lasse sind "id_ein" und "id_aus" und die werden auf jeder Seite auf die ich im action verweise in der Adressleiste angezeigt außer halt auf der Seite wo ich es haben will... darum bin ich auch so irritiert!
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

Moin,
also ich sitze da immer noch dran. Der Rückgabewert ist dann url.../.../?e=1 Wenn ich dann auf eine nicht vorhandene Seite die Daten weiterleite zeigt er mir url.../.../irgendeine-seite/?=wert1&wert2&wert3 an. Das würde mir ja schon etwas weiter helfen wenn das in Company stehen würde.
Aber das, was ich will ist die Liste da oben auch als Liste und nicht als Werte einfach in der URL. Wenn das Listen wären könnte ich die Werte in den Listen mit nem Query wie zum Beispiel einem "Filter" versehen.

Code: Alles auswählen

        q = queryset(request)
        ein = request["id_ein"]
        aus = request["id_aus"]
        einliste = ein.split(',')
        ausliste = aus.split(',')
        q.filter(pk__in=einliste).exclude(pk__in=ausliste)
        return q
Der Code halt wie oben... :- /
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

Bild
Hier ist ein Bild, was es hoffentlich vereinfacht was ich will ^^
Ihr sieht oben links meine "Aktionsleiste" wo ich eine "Erweiterte Tag Suche" auswähle. Dann öffnet sich diese Seite mit der "Ausschluss Suche" und den 2 Stichwortfeldern. Ich markiere oben welche ich will und unten welche auf garkeinen Fall vorkommen dürfen. Klick ich auf OK soll er mir dann die Anzeigeliste im Hintergrund dem entsprechend anpassen.
Dort ist die Post Methode auf dem OK was die Daten aus den Feldern an Company/company schickt.

Ich versuche das ganze nun um zu bauen weil es einfach nicht klappt. Ich versuche jetzt mal die POST Methode an ein View zu schicken weil ich ja im Adminbereich arbeite. Könnte es da nicht zu Problemen kommen? Geht das eig. so einfach vom Adminbereich dann in ein View zu springen und wieder in den Adminbereich? Weil das View könnte ich ja dann mit:

Code: Alles auswählen

def company_view(request):
    if request.method == 'POST':
        ein = request.POST["id_ein"]
        aus = request.POST["id_aus"]
        res = Company.objects.filter(subkey__id=ein).exclude(subkey__id=aus)
        return render_to_response("admin/companyTest.html",{'res':res})
    else:
        return render_to_response("admin/error.html")
ansprechen. Der else block ist nur, damit ich wenns net klappt halt ne Fehlermeldung habe zum debuggen.

Code: Alles auswählen

	
{% extends "admin/company_view.html" %}
{% block content %}
    {% for object in res %}
        {{ object }}
    {% endfor %}
{% endblock %}
company_view ist quasie die base.html + noch was speziel für comany angepasstes was ich dann einfach übernehme.
So würde ich dann das View schreiben.
Nur ich weiß nicht wie ich dann die URLs verändern soll?

Code: Alles auswählen

(r'^admin/Company/company', 'views.company_view'),
Dann würde meine verrückte Reihenfolge so aussehen:
Ich bin in der Company/company/ und führe die POST Methode aus... die Seite lädt sich dann neu und merkt in company_view dass es auf das Method == POST reagieren soll was dann filtert und das gefilterte im neuen View öffnet oder?

Lange Rede kurzer Sinn... es klappt nicht... Das POST wird nicht angesprochen im View und die Seite wird ohne jegliche Änderung auch ohne Fehlermeldung wieder aufgerufen... Ich glaube dass er auch einfach das Company vom Adminbereich öffnet und nicht mein neu geschriebenes View. kling aber finde ich alles relativ logisch/richtig... Wenn er doch wenigstens irgendeinen Fehler ausspucken würde warum es nicht klappt aber leider nichts :- /
Antworten