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
Django ManyToManyField Problem
Wir haben ein eigenes Forum, wo man Threads zu Django eröffnen sollte:
Web- und Netzwerkprogrammierung
Webseiten erstellen mit Web-Frameworks wie Django, Pylons oder TG, sowie genereller auch Sockets, TCP/IP, (XML-)RPC etc.
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:
Und hier die Admin datei in der der Aufruf von get_keywords passiert:
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
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'
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)
[<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
Verusch mal (aus dem Kopf):
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…
Code: Alles auswählen
def get_keywords(self):
a = list(self.keyword.all())
return a and u", ".join(unicode(a)) or u""
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…
Hey,
der Code von dir hat uns auf jeden fall zu unserem Ziel geführt... sehr spartanisch aber es funktioniert
So haben wir anstatt [<Keyword:a,b,c>] wunderbar a, b, c
Danke danke
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
Danke danke

Mein Fehler, sollte so heißen: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 ^^
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""
apollo13, wozu der Sonderfall für ein leeres a? Dies sollte doch auch gehen:
Stefan
Code: Alles auswählen
u", ".join(unicode(k) for k in self.keyword.all())