2012-06-05 23 views
11

Soy bastante nuevo en Django y habiendo leído la documentación en sus modelos relacionales y formularios de administración en línea (docs on InlineModelAdmin) Estoy luchando para descubrir si lo siguiente es posible de la caja, o si debería rodar mis propios formularios.Agregando muchos objetos en línea a muchos en Django admin

Digamos que tengo dos objetos: Películas y Administración, esta es una relación de muchos a muchos como se define en las declaraciones modelo de la siguiente manera:

class Film(Model): 
    director = ManyToManyField('Director') 

ahora en forma detallada para un objeto de Cine Me gustaría agregar objetos de Director en línea (solo tienen un campo de nombre como propiedad exclusiva). No solo seleccionando las instancias existentes, sino que puede crear las nuevas, en línea en la forma del objeto Película.

class DirectorInline(admin.TabularInline): 
    model = Director 
    extra = 3 


class FilmAdmin(admin.ModelAdmin): 
    inlines = (
     DirectorInline, 
     ) 

Esto arroja un error, porque se espera una clave externa en el objeto Director. ¿Lo que intento lograr es posible sin crear un formulario personalizado, un validador, etc.? Cualquier consejo en la dirección correcta sería muy apreciado, gracias de antemano.

Respuesta

20

El widget predeterminado para el campo Muchos a muchos en admin o widgets con la propiedad filter_vertical o filter_horizontal le permite agregar un nuevo elemento. Hay un signo verde "+" cerca del campo para abrir una ventana emergente y agregar una nueva instancia de Director.

Pero si necesita el administrador de estilo en línea, debe hacer referencia al through-model. Si no especifica el modelo personalizado, Django crea un modelo simple con 2 claves externas para Director y Película.

Así que usted puede tratar de crear en línea como

class DirectorInline(admin.TabularInline): 
    model = Film.director.through 
    extra = 3 

Esto no lanzará una excepción y se generará un formulario en línea, pero usted tendrá que seleccionar a los directores de la lista desplegable. Creo que puedes sobreescribirlo usando un formulario personalizado.

+0

Igor, (o cualquier otra persona), ¿cómo agregaría opciones al en línea como campos? – Greg

+2

@Greg Realmente no entiendo lo que intentas lograr. Si desea guardar datos adicionales en su modelo M2M, puede usar modelos personalizados a través de https://docs.djangoproject.com/en/1.6/topics/db/models/#intermediary-manytomany Si solo desea agregar campos Para el panel de administración, puede redefinir '' DirectorInline.form'' – Igor

+0

@Igor ¿Cómo redefinir Inline.form? – mamasi

Cuestiones relacionadas