2009-11-09 23 views
7

Zuerst lege ich dar, was ich zu erreichen versuche, falls es einen anderen Weg gibt!Bearbeiten von beiden Seiten von M2M in der Admin-Seite

Ich möchte in der Lage sein, beide Seiten einer M2M-Beziehung (vorzugsweise auf der Admin-Seite, obwohl es möglicherweise auf einer normalen Seite sein könnte) mit einer der Multi-Select-Schnittstellen zu bearbeiten.

Das Problem kommt offensichtlich mit der Rückseite, da die Hauptseite (wo die Beziehung definiert ist) funktioniert einfach gut automatisch.

Ich habe einige der Ratschläge hier versucht, um eine Inline zu bekommen und das funktioniert, aber es ist nicht eine sehr nette Schnittstelle.

Der Ratschlag, den ich auf der Django-Mailingliste erhielt, war, eine benutzerdefinierte ModelForm zu verwenden. Ich habe so weit wie eine Multiselect-Box zu erscheinen, aber es scheint nicht zu etwas "verbunden" werden, wie es nicht mit etwas ausgewählt startet und speichert keine Änderungen, die vorgenommen werden.

Hier der entsprechende Code-Schnipsel:

#models.py 
class Tag(models.Model): 
    name = models.CharField(max_length=200) 

class Project(models.Model): 
    name = models.CharField(max_length=200) 
    description = models.TextField() 
    tags = models.ManyToManyField(Tag, related_name='projects') 

#admin.py 
class TagForm(ModelForm): 
    fields = ('name', 'projects') 
    projects = ModelMultipleChoiceField(Project.objects.all(), widget=SelectMultiple()) 
    class Meta: 
     model = Tag 

class TagAdmin(admin.ModelAdmin): 
    fields = ('name', 'projects') 
    form = TagForm 

Jede Hilfe sehr geschätzt werden würde, entweder den Code bekommt es oben zu arbeiten oder durch einen besseren Weg, um zu tun!

DavidM

+1

Wow, freundliche Leute hier, 11 Minuten und 2 Stimmen! – DavidM

Antwort

2

Der Grund, warum nichts automatisch passiert ist, dass die „Projekte“ Feld nicht ein Teil des Tag-Modell ist. Was bedeutet, dass Sie alle Arbeiten selbst erledigen müssen. So etwas wie (in TagForm):

def __init__(self, *args, **kwargs): 
    super(TagForm, self).__init__(*args, **kwargs) 
    if 'instance' in kwargs: 
     self.fields['projects'].initial = self.instance.project_set.all() 

def save(self, *args, **kwargs): 
    super(TagForm, self).save(*args, **kwargs) 
    self.instance.project_set.clear() 
    for project in self.cleaned_data['projects']: 
     self.instance.project_set.add(project) 

Beachten Sie, dass der Code nicht getestet ist, so dass Sie tweek Möglicherweise müssen, um es einige, um es zu arbeiten.

+0

Sieht so aus als wäre es der Trick, danke, aber ich bekomme ein Problem damit. "Instanz" ist in Kwarts vorhanden, aber das Setzen der Initiale scheint keine Wirkung zu haben. Um zu testen, habe ich versucht, self.fields ['name']. Initial = 'test' zu setzen und das wird auch nicht auf der Oberfläche angezeigt. – DavidM

+0

Ich werde dies als die Antwort markieren und damit herumfummeln. Wenn ich es sortiert habe, werde ich die Antwort hier posten. Vielen Dank! – DavidM

Verwandte Themen