Question

D'abord, je parierais ce que je suis en train de réaliser dans le cas où il y a une autre façon de s'y prendre!

Je veux être en mesure de modifier les deux côtés d'une relation de communications M2M (de préférence sur la page d'administration, bien que si besoin est, il pourrait être sur une page normale) en utilisant l'une des interfaces sélectionnez plusieurs.

Le problème vient évidemment avec le côté inverse, comme le côté principal (où la relation est définie) fonctionne très bien automagiquement.

Je l'ai essayé quelques-uns des conseils ici pour obtenir une ligne apparaître et qui fonctionne, mais ce ne est pas une interface très agréable.

Le conseil que je suis sur la liste de diffusion django était d'utiliser un ModelForm personnalisé. J'ai aussi loin que d'obtenir une boîte de multiselect à apparaître, mais il ne semble pas être « connecté » à tout comme il ne démarre pas avec quoi que ce soit sélectionné et ne sauvegarde pas les modifications apportées.

Voici les extraits appropriés de code:

#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

Toute aide serait très apprécié, soit obtenir le code ci-dessus pour travailler ou en offrant une meilleure façon de le faire!

DavidM

Était-ce utile?

La solution

La raison pour laquelle rien ne se passe est automatiquement que le champ « projets » ne fait pas partie du modèle Tag. Ce qui signifie que vous devez faire vous-même le travail. Quelque chose comme (en 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)

Notez que le code est non testé afin que vous pourriez avoir besoin de Tweek il un peu pour le faire fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top