Django - consulta relación muchos a muchos en la vista admin

 
Vista:
sin imagen de perfil

consulta relación muchos a muchos en la vista admin

Publicado por cristian (1 intervención) el 17/07/2016 02:02:48
Buenas, como estan? - les comento que estoy arrancando con python y django, y para ello empece haciendo el típico sistemita de biblioteca, por ahora solo estoy trabajando con la vista admin, y bueno llegue a un punto en el cual me surge una duda, cuando tenemos una relacion de muchos a muchos (en mi caso libro y autores) django nos brinda una lista de selección multiple para seleccionar por ejemplo autores si es que estamos en la vista de libro, bueno buscando un poco encontre la opcion inlines y la aplique quedando asi:

Captura-de-pantalla-de-2016-07-16-20-49-07

el problema que encuentro aqui es que independientemente de la lista de seleccion multiple y las filas con el combo box es que pasa por ejemplo si el sistema tiene, nose 10000 autores... sería muy complicado para el usuario que encuentre el que busca... y que pasaría si por ejemplo en vez de ser autores sea otro modelo el cual tengo que mostrar mas datos... ya que ahora esta utilizando el metodo __string__ para identificar los objetos. Bueno desde ya les agradezco, un saludo! les dejo el codigo por las dudas.
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from django.db import models
import datetime
 
class Biblioteca(models.Model):
    razon_social = models.CharField(max_length=200)
    telefono = models.CharField(max_length=100)
    correo = models.CharField(max_length=150)
    def __str__(self):
        return self.razon_social
 
class Genero(models.Model):
    nombre = models.CharField(max_length=200)
    def __str__(self):
        return self.nombre
 
class Editorial(models.Model):
    nombre = models.CharField(max_length=200)
    correo = models.CharField(max_length=200)
    def __str__(self):
        return self.nombre
 
class Autor(models.Model):
    nombre = models.CharField(max_length=200)
    apellido = models.CharField(max_length=200)
    def __str__(self):
        return self.nombre +" "+self.apellido
 
class Libro(models.Model):
    EDICIONES=(
        (1,'Primera'),
        (2,'Segunda'),
        (3,'Tercera'),
        (4,'Cuarta'),
        (5,'Quinta'),
    )
    nombre = models.CharField(max_length=200)
    edicion = models.IntegerField(choices=EDICIONES)
    fecha_publicacion = models.DateField("fecha de publicación")
    editorial = models.OneToOneField(Editorial)
    genero = models.OneToOneField(Genero)
    autores = models.ManyToManyField(Autor)
    biblioteca = models.ForeignKey(Biblioteca, default= Biblioteca.objects.get(id=1))
 
 
class Ejemplar(models.Model):
    codigo = models.IntegerField(default=0)
    libro = models.ForeignKey(Libro)
    biblioteca = models.ForeignKey(Biblioteca)
 
class Socio(models.Model):
    nombre = models.CharField(max_length=200)
    apellido = models.CharField(max_length=200)
    dni = models.IntegerField()
    teledono = models.CharField(max_length=200)
    direccion = models.CharField(max_length=200)
    correo = models.CharField(max_length=200)
    fecha_nacimiento = models.DateTimeField()
    biblioteca = models.ForeignKey(Biblioteca)
    def __str__(self):
        return self.nombre +" "+self.apellido
 
class Prestamo(models.Model):
    fecha_incio = models.DateTimeField('fecha de inicio')
    fecha_fin = models.DateTimeField('facha de fin')
    ejemplar = models.ForeignKey(Ejemplar)
    socio = models.ForeignKey(Socio)

admin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from django.contrib import admin
 
from .models import Libro, Editorial, Genero, Autor, Biblioteca
 
class AutoresInline(admin.TabularInline):
    model = Libro.autores.through
 
class AutorAdmin(admin.ModelAdmin):
    inlines = [
               AutoresInline,
    ]
 
class LibroAdmin(admin.ModelAdmin):
    fields = ['biblioteca',('editorial', 'genero', 'edicion'), ('nombre', 'fecha_publicacion')]
    list_display = ('nombre', 'fecha_publicacion', 'genero', 'edicion',)
    readonly_fields = ('biblioteca',)
    inlines = [
               AutoresInline,
    ]
 
admin.site.register(Libro, LibroAdmin)
admin.site.register(Editorial)
admin.site.register(Genero)
admin.site.register(Autor)
admin.site.register(Biblioteca)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

consulta relación muchos a muchos en la vista admin

Publicado por Francisco José (2 intervenciones) el 16/03/2017 19:30:30
No se si quieres esto pero la manera mas facil y clara de mostrar autores cuando quieres registrar un libro es esta:

1
2
3
4
5
6
7
8
9
10
11
class LibroAdmin(admin.ModelAdmin):
 
    fields = ['biblioteca',('editorial', 'genero', 'edicion'), ('nombre', 'fecha_publicacion')]
 
    list_display = ('nombre', 'fecha_publicacion', 'genero', 'edicion',)
 
    readonly_fields = ('biblioteca',)
 
    filter_horizontal= ('autores',)
 
    ]

El post ya tiene tiempo pero para si alguien tiene una duda sobre esto, le podrá servir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar