Django ManyToManyField Problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

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
Benutzeravatar
snafu
User
Beiträge: 6831
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

Nicht gefunden... dachte mir schon sowas. Danke für Verschieben.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Vlt solltest du mal deinen Code posten und/oder die Docs lesen…
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

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
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

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…
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

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 :-)
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

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 ;)
csc
User
Beiträge: 23
Registriert: Montag 15. Juni 2009, 11:22

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 ^^
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

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""
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

apollo13, wozu der Sonderfall für ein leeres a? Dies sollte doch auch gehen:

Code: Alles auswählen

u", ".join(unicode(k) for k in self.keyword.all())
Stefan
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

hmm, stimmt allerdings ;) das passiert mir bei join immer
Antworten