2011-02-03 8 views
12

Digamos que tengo modelos de Libros y Autor.¿Cómo puedo habilitar ManyToManyFields en línea en mi sitio de administración de Django?

class Author(models.Model): 
    name = CharField(max_length=100) 

class Book(models.Model): 
    title = CharField(max_length=250) 
    authors = ManyToManyField(Author) 

deseo que cada libro tenga múltiples autores, y en el sitio de administración de Django quiero ser capaz de añadir varios nuevos autores de un libro de su página de edición, de una sola vez. No necesito agregar libros a los autores.

¿Esto es posible? Si es así, ¿cuál es la mejor y más fácil forma de lograrlo?

Respuesta

16

Es bastante simple de hacer lo que quiere, si te estoy haciendo correctamente:

debe crear un archivo admin.py dentro de su directorio de aplicaciones y luego escribir el siguiente código:

from django.contrib import admin 
from myapps.models import Author, Book 

class BookAdmin(admin.ModelAdmin): 
    model= Book 
    filter_horizontal = ('authors',) #If you don't specify this, you will get a multiple select widget. 

admin.site.register(Author) 
admin.site.register(Book, BookAdmin) 
+1

Si usa el código anterior en admin.py, obtendrá un pequeño botón "+" junto al selector de filtros. Puede hacer clic en él y agregar "nuevos autores", uno a la vez, que se transferirán al lado filtrado al agregarlos. – Prateek

+0

Su solución es la correcta, pero tiene un error: 'class Book' debe ser' class BookAdmin'. Además, no necesita especificar el modelo ('modelo = Libro'). – Etienne

+2

@Etienne: Explícito es mejor que implícito. ~ Zen of Python - Tim Peters (PEP 20) Disculpe por perderse en BookAdmin. Corregido – Prateek

7

Prueba esto:

class AuthorInline(admin.TabularInline): 

    model = Book.authors.through 
    verbose_name = u"Author" 
    verbose_name_plural = u"Authors" 


class BookAdmin(admin.ModelAdmin): 

    exclude = ("authors",) 
    inlines = (
     AuthorInline, 
    ) 

Es posible que tenga que añadir a raw_id_fields = ("author",)AuthorInline si tiene muchos autores.

+0

EXCELENTE !!! ¡GRACIAS! –

+0

¡Gracias también! Estoy tan feliz de encontrar esta vieja respuesta. Si todavía estás aquí, ¿podrías explicar cómo funciona 'raw_id_fields' con **" autor "**? El campo con ese nombre no está declarado en ninguno de los modelos. ¿A qué valor se refiere? – cezar

+0

Tengo un presentimiento, el ** "autor" ** obtendría el valor de la columna ** author_id ** en la tabla para 'Book.authors.through' que sería algo así como' app_book_authors' ('app' stands aquí para la etiqueta de la aplicación). – cezar

Cuestiones relacionadas