Pregunta

En primer lugar voy a sentar a cabo lo que estoy tratando de lograr en caso de que haya una manera diferente de hacerlo!

Quiero ser capaz de editar ambos lados de una relación M2M (preferiblemente en la página de administración, aunque si es necesario se podría estar en una página normal) usando cualquiera de las interfaces múltiples seleccionados.

El problema, obviamente, viene con el reverso, como el lado principal (donde se define la relación) funciona bien automágicamente.

He tratado algunos de los consejos aquí para obtener una línea de aparecer y que funciona, pero no es una interfaz muy agradable.

El consejo que me dieron en la lista de correo de Django era utilizar un ModelForm personalizado. Tengo en cuanto a conseguir una caja de selección múltiple a aparecer pero tampoco parece estar "conectado" a nada, ya que no se inicia con nada seleccionado y no guarda los cambios que se realizan.

Aquí están los fragmentos apropiados de código:

#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

Cualquier ayuda sería muy apreciada, ya sea con el código anterior para trabajar o proporcionando una mejor manera de hacerlo!

DavidM

¿Fue útil?

Solución

La razón por la que no pasa nada de forma automática es que el campo "proyectos" no es una parte del modelo de etiqueta. Lo que significa que tiene que hacer todo el trabajo usted mismo. Algo así como (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)

Tenga en cuenta que el código no se ha probado de modo que pueda necesitar para tweek que algunos a conseguir que funcione.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top