Django ForeignKey auswahl reduzieren

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Toffer
User
Beiträge: 9
Registriert: Freitag 19. Juni 2009, 09:49

Hallo ihr lieben,

ich habe folgendes Problem:

Code: Alles auswählen

class Communication(models.Model):
	person = models.ForeignKey(Person)
	worker = models.ForeignKey(Adviser,verbose_name='Betreuer')
	keyword = models.ForeignKey(Keyword,blank=True,null=True,verbose_name='Stichwort')#Liste der Schlüsselwörter
	subkey = models.ManyToManyField(SubKeyword,blank=True,null=True,verbose_name='Unterpunkt')#Hier soll die durch die Auswahl eine keywords reduzierte liste erscheinen
	date = models.DateField('Datum')
	type = models.ForeignKey(CommunicationType,verbose_name='Kontaktart')
	topic = models.CharField(max_length=255)
	text = models.TextField(blank=True)

	def __unicode__(self):
		return self.topic

	class Admin:
		pass
	class Meta:
		verbose_name = decode_entities('Kontakt')
		verbose_name_plural = decode_entities('Kontakte')
Ich würde gerne die Auswahlmöglichkeiten in dem Feld subkey reduzieren, wenn also ein keyword ausgewählt wurde sollen in dem subkey Auswahl Feld nur noch die subkeys angezeigt werden welche keyword zugeordnet wurden. Die zuordnung von subkeys zu keywords sieht folgendermaßen aus:

Code: Alles auswählen

class SubKeyword(models.Model):
    name = models.CharField('Name',max_length=100)
    discription = models.TextField('Beschreibung',blank=True,null=True)
    def __unicode__(self):
        return self.name
    class Meta:
        verbose_name = 'Unterpunkt'
        verbose_name_plural = 'Unterpunkte'
class Keyword(models.Model):
    word = models.CharField('Stichwort',max_length=100)
    subk = models.ForeignKey(SubKeyword,blank=True,null=True,verbose_name='Unterpunkt')
    def __unicode__(self):
        a = self.word
        return a
    def toll():
        return self.word
    class Meta:
        verbose_name = 'Stichwort'
        verbose_name_plural = decode_entities('Stichwörter')
Meine Frage ist nun ob dies insegsamt überhaupt machbar ist, denn django müsste ja auf eine Aktion reagieren ohne die Seite neu zu laden. Ich hatte da an die einbindung von ajax gedacht. Die frage ist nur wie..

vielen Dank und beste Grüße

Toffer
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Jo, das Admininterface (speziell: das Javascript) modifizieren und von "pre_save" erben.

Bei aufkommenden Bahnhöfen in diesem Beitrag bitte das Django-Doku-Orakel befragen ;-)
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

Ich habe da auch was gefunden,
http://code.google.com/p/django-ajax-filtered-fields/
Arbeiten mit Ajax in Django. Ist glaube ich genau das, was du brauchts. Nur leider weiß ich nicht wie man sowas nachträglich auf einen Server aufspielt um damit arbeiten zu können... die Installationsanleitung lässt leider zu wünschen übrig auf der Seite.
Weiß vll einer hier wie man sowas installieren kann, dann könntest du mit Ajax ohne Probleme sowas umsetzen!

Gruß csc
Toffer
User
Beiträge: 9
Registriert: Freitag 19. Juni 2009, 09:49

Ich hab nun schon einige stunden gesucht aber finde einfach keine Lösung, wie kann ich die methode checkKeyword aus dem javascript ansprechen

Code: Alles auswählen

class Communication(models.Model):
	def __unicode__(self):
		return self.topic
	def checkKeyword(request,args,kwargs):
		if request.method == "POST":
			post = request.POST.copy()
        return ' '

Code: Alles auswählen

 $(document).ready(function() {
     $("#id_keyword").change(function() {
	var keyid = $("#id_keyword").val();
	data = {keyid:keyid};
	var args = {type:"POST",url:"{% url communication.checkKweyword%}",data:data,complete:done};
	$.ajax(args);
	alert("Hallo");
     });

 });
Sorry wenn es eine noobige Frage ist aber ich kann mir auch nach langer sucherrei nicht helfen :/

ich danke euch für eure hilfe

Toffer
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Äh, du musst einen Request an die richtige URL an den Server machen. Bist du dir sicher, dass dein {% url %}-Tag die richtige URL erzeugt?
Toffer
User
Beiträge: 9
Registriert: Freitag 19. Juni 2009, 09:49

kann man denn in der url.py urls für den adminberreich hinzufügen also außer der die den adminberreich aktiviert? Ich dachte das geht nur für views aber ich muss ja eigentlich via javascript wieder das model ansprechen um den inhalt zu ändern oder nicht?

beste grüße

Toffer
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Du schmeißt da glaube ich ziemlich viel zusammen was nicht zusammen gehört.

Deine Aufgabe ist es, eine HTML-Auswahlbox dynamisch anzupassen (d.h. Einträge zu löschen oder ähnlich). Dazu musst du einen Request an den Server machen, der dir dann sagt, welche Einträge denn jetzt noch angezeigt werden sollen (bzw. welche gelöscht werden, das ist sicherer).

Also schreibst du dir ein View (zb unter der URL '/actions/filter_foreignkey/IDDeinesAusgewähltenModels/'), welches dir die IDs der zu versteckenden Einträge der Selectbox mitteilt (am besten via JSON). Dann liest du das aus und nimmst die Einträge aus der Auswahlbox raus.

Falls du das View nur für eingeloggte Admins bedienbar machen willst, nimm einfach die Authorisation-Dekoratoren, die Django mitbringt.

Gruß
Toffer
User
Beiträge: 9
Registriert: Freitag 19. Juni 2009, 09:49

das dachte ich mir nämlich schon fast das ich mit views arbeiten muss, ich dachte nur ich könnte das ganze mit hilfe von ajax auch schon in dem von django genierten admin berreich machen.

aber vielen vielen dank für die hinweise Smile

Toffer
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Du weißt schon, was AJAX bedeutet??
„Asynchronous JavaScript and XML“

Sprich es ist nicht nur clientseitig wie JavaScript, sondern es findet ein HttpRequest "Asynchronous", eben ohne Seiten-Reload statt.

Demnach brauchst du meiner Meinung nach auch einen View ;)
Antworten