2009-11-09 12 views
7

¡Primero, expondré lo que intento lograr en caso de que haya una manera diferente de hacerlo!Edición de ambos lados de M2M en la página de administración

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

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

He intentado algunos de los consejos aquí para obtener un inline para aparecer y eso funciona, pero no es una interfaz muy agradable.

El consejo que recibí en la lista de correo de django fue usar un Modelo de formulario personalizado. He llegado a mostrar un cuadro de selección múltiple, pero parece que no está "conectado" a nada, ya que no comienza con nada seleccionado y no guarda los cambios realizados.

aquí está el 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

+1

¡Guau, gente amable aquí, 11 minutos y 2 votos! – DavidM

Respuesta

2

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 tienes que hacer todo el trabajo tú 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.

+0

Parece que podría ser el truco, gracias, pero tengo un problema con él. 'instancia' está presente en kwargs, pero la configuración inicial parece no tener ningún efecto. Para probar intenté establecer self.fields ['name']. Initial = 'test' y eso tampoco aparece en la interfaz. – DavidM

+0

Voy a marcar esto como la respuesta y sigo rebuscando con él. Si lo soluciono, publicaré la respuesta aquí. ¡Gracias! – DavidM

Cuestiones relacionadas