Seite 1 von 1
Django ManyToManyField Problem
Verfasst: Montag 15. Juni 2009, 11:30
von csc
Hallo,
Ich habe ein ManyToManyField mit Daten gefüllt. Nun möchte ich auf der Ansichtsseite im Adminbereich mir meine anderen Daten + das Many Feld anzeigen lassen. Ich bekomme es nicht hin, dass das Many Feld angezeigt wird, es steht dann nur (none) im Feld meiner Ansichtstabelle.
Dank self.object.all() kann ich mir den Inhalt anzeigen lassen aber dann habe ich eine Formatierung die garincht geht.
[<a>,<b>,<c>] .. ich möchte aber a, b, c angezeigt bekommen!
Ich bekomme einfach keinen String da raus! Hatte versucht es mit einer eigenen Funktion von den Zeichen zu trennen aber dann kommt immer wieder (none) ...
Wisst ihr zufällig wie man ein ManyToManyField in eine Ansichtstabelle anzeigt? Lustigerweise zeigt der Filter den ich hinzugefügt habe das ManyToManyField an der rechten Seite ohne Probleme an.
Danke im Vorraus,
Christian
Verfasst: Montag 15. Juni 2009, 11:58
von snafu
Wir haben ein eigenes Forum, wo man Threads zu Django eröffnen sollte:
Verfasst: Montag 15. Juni 2009, 13:36
von csc
Nicht gefunden... dachte mir schon sowas. Danke für Verschieben.
Verfasst: Montag 15. Juni 2009, 17:49
von apollo13
Vlt solltest du mal deinen Code posten und/oder die Docs lesen…
Verfasst: Dienstag 16. Juni 2009, 15:19
von csc
Die docs habe ich gelesen.. komme an der Stelle leider trotzdem nicht weiter.
Das Problem an dem ganzen ist, dass der Rückgabewert des ManyToManyFields ein Queryset ist, welches sich ähnlich einer liste(array) verhält aber nicht mit der String funktion join() arbeiten kann.
Nun möchte ich aber alle einträge in einen String packen um diese ordentlich formatiert ausgeben zu können.
Hier das entsprechende Model:
Code: Alles auswählen
from django.db import models
from ropdog.Keyword.models import *
from ropdog.Event.models import Event
from ropdog.Company.models import *
from ropdog.Position.models import *
import string
# Create your models here.
class Person(models.Model):
keyword = models.ManyToManyField(Keyword,null=True,blank=True)
event = models.ManyToManyField(Event,null=True,blank=True)
company = models.ForeignKey(Company)
position = models.ForeignKey(Position)
fname = models.CharField('Vorname',max_length=100)
sname = models.CharField('Nachname',max_length=100)
email = models.CharField('E-Mail',max_length=100)
phone = models.CharField('Tel.',max_length=50)
mobile = models.CharField('Handy',max_length=50)
comment = models.TextField('Kommentar')
def get_events(self):
x = self.event.all()
return x
def get_keywords(self):
a = list(self.keyword.all())
return ", ".join(a)
def __unicode__(self):
return self.sname
class Meta:
verbose_name = 'Person'
verbose_name_plural = 'Personen'
Und hier die Admin datei in der der Aufruf von get_keywords passiert:
Code: Alles auswählen
from ropdog.Person.models import *
from django.contrib import admin
class PersonAdmin(admin.ModelAdmin):
search_fields = ['fname','sname','keyword__word']
list_display = ('sname', 'fname','company','position','email','get_keywords','get_events')
list_filter = ['company','keyword']
admin.site.register(Person,PersonAdmin)
Wenn ich in der Funktion get_keywords lediglich die Liste als Rückgabewert zurückgebe wird diese inhaltlich auch wunderbar angezeigt nur blöd formatiert in etwa so:
[<Keyword:irgendeinwort>,<Keyword:irgendeinwort2>]
Wenn ich aber mit der join funktion arbeite wird in der Spalte lediglich "None" angezeigt.
Schon einmal vielen Dank für euer interesse und eure Hilfe.
beste grüße csc
Verfasst: Dienstag 16. Juni 2009, 21:44
von apollo13
Verusch mal (aus dem Kopf):
Code: Alles auswählen
def get_keywords(self):
a = list(self.keyword.all())
return a and u", ".join(unicode(a)) or u""
None kommt bei dir immer dann heraus, wenn du keine Keywords zugewiesen hast.
Wobei das so keine gute Idee ist, da das ein Query pro Objekt ist, das kann viel werden, vor allem wenn die changelist page lang ist…
Verfasst: Mittwoch 17. Juni 2009, 08:39
von csc
Hey,
der Code von dir hat uns auf jeden fall zu unserem Ziel geführt... sehr spartanisch aber es funktioniert
Code: Alles auswählen
def get_keywords(self):
a = self.keyword.all()
x = a and u"".join(unicode(a))
z = x.replace("[","")
x = z.replace("]","")
z = x.replace("<Keyword:","")
x = z.replace(">","")
return x
So haben wir anstatt [<Keyword:a,b,c>] wunderbar a, b, c
Danke danke

Verfasst: Mittwoch 17. Juni 2009, 17:45
von apollo13
Omg, das ist grausam, Aber da mein Beispiel noch immer nicht geht ist dein Problem einfach das, dass du in der anderen Klasse kein __unicode__ definiert hast

Verfasst: Donnerstag 18. Juni 2009, 08:15
von csc
Klar habe ich __unicode__ definiert. Nur ist die Ausgabe eines ManyToManyFields objekt so " [<a,b,x>] " und wenn ich versuche nur Teile aus dem Objekt zu laden kommt halt leider " (none) ". Daher der Spagetticode ^^
Verfasst: Donnerstag 18. Juni 2009, 17:57
von apollo13
csc hat geschrieben:Klar habe ich __unicode__ definiert. Nur ist die Ausgabe eines ManyToManyFields objekt so " [<a,b,x>] " und wenn ich versuche nur Teile aus dem Objekt zu laden kommt halt leider " (none) ". Daher der Spagetticode ^^
Mein Fehler, sollte so heißen:
Code: Alles auswählen
def get_keywords(self):
a = list(self.keyword.all())
return a and u", ".join([unicode(i) for i in a]) or u""
Verfasst: Donnerstag 18. Juni 2009, 21:24
von sma
apollo13, wozu der Sonderfall für ein leeres a? Dies sollte doch auch gehen:
Stefan
Verfasst: Freitag 19. Juni 2009, 13:03
von apollo13
hmm, stimmt allerdings

das passiert mir bei join immer