Frage

Zuerst werde ich herauslegen, was ich erreichen möchte, falls es eine andere Möglichkeit gibt, es zu erledigen!

Ich möchte in der Lage sein, beide Seiten einer M2M -Beziehung (vorzugsweise auf der Administratorseite zu bearbeiten, obwohl dies bei Bedarf auf einer normalen Seite sein könnte) mit einem der Multi -Select -Schnittstellen.

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

Ich habe hier einen Teil der Ratschläge ausprobiert, um eine Inline zu erhalten, und das funktioniert, aber es ist keine sehr schöne Schnittstelle.

Der Rat, den ich auf die Django -Mailingliste erhielt, lautete, einen benutzerdefinierten Modelform zu verwenden. Ich habe so weit, dass ein Multiselect -Box angezeigt wird, aber es scheint nicht mit irgendetwas "verbunden" zu sein, da sie nicht mit irgendetwas ausgewählt wird und keine Änderungen speichert, die vorgenommen werden.

Hier sind die entsprechenden Codeausschnitte:

#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 wäre sehr geschätzt, entweder den oben genannten Code zum Arbeiten zu bringen oder einen besseren Weg zu bieten, dies zu tun!

Davidm

War es hilfreich?

Lösung

Der Grund, warum nichts automatisch passiert, ist, dass das Feld "Projekte" nicht Teil des Tag -Modells ist. Was bedeutet, dass Sie die ganze Arbeit 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 ungetestet ist, sodass Sie möglicherweise einige Tweek -Kenner zum Laufen bringen müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top