Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- form_[lo_que_repsenta]_select = function() {
- //Selecciones el elemento select segun el name en el mismo
- //en este ejemplo el tag select seria
- //<select name="cliente" class="form-control"></select>
- $('select[name=cliente]').select2({
- //Titulo
- placeholder: '$TITULO$',
- //El ancho
- width: '100%',
- //A partir de cuento empezara a buscar en el backend
- minimumInputLength: 5,
- ajax: {
- //A cual url llamaremos para traer los datos
- //Por defecto es el url get_jsonmodel, que sabe como llamar los datos de los modelos
- //Pero estos antes tienen que estar definidos en sales_man.format_cache en el metodo model_keyfiels de la clase FormatCache
- // Que esta en sales_man->format_cache.FormatCahce.model_keyfiels
- // Es decir si tienes un metodo en cualquiera de los paquetes, ya sea.
- // -> sales_man
- // -> imp_man
- // -> dashboard
- // -> warehouse_man
- // -> ... etc etc
- // Si quieres traerlo mediante get_jsonmodel lo tienes que definier en format_cache en el metodo model_keyfiels
- // Sopongamos el modelo UserProfile que esta en el paquete dashboard
- // El modelo es el siguiente.
- // class UserProfile(model.models):
- // cedula = models.CharField(max_length=120)
- // nombrefantasia = models.CharField(max_length=120)
- // nombrefactura = models.CharField(max_length=120)
- // ... etc etc
- // Como ven este modelo tiene muchisimos atributos
- // Estos atributos los podemos definir en format_cache de la siguiente manera.
- // 'dashboard': {'fields': ['cedula', 'nombrefantasia']}
- //
- // A su vez si el modelo tiene metodos, por ejemplo un metodo para acortar el nombre
- //
- // class UserProfile(model.models):
- // cedula = models.CharField(max_length=120)
- // nombrefantasia = models.CharField(max_length=120)
- // nombrefactura = models.CharField(max_length=120)
- // ... etc etc
- // def get_nombrecorto(self):
- // return self.nombrefantasia[0:10]
- //
- // En el ejemplo anterior se acorta el nombre a 10 caracteres.
- // Este metodo tambien podemos definirlo en format_cache, mediante la llave methods
- // 'userprofile': {'fields': ['cedula', 'nombrefantasia'],
- // 'methods': ['get_nombrecorto'] }
- // De esta forma el metodo estara disponible para nuestro uso en el front-end
- //
- // Tambien el modelo puede que tenga ForeignKeys
- //
- // class UserProfile(model.models):
- // cedula = models.CharField(max_length=120)
- // nombrefantasia = models.CharField(max_length=120)
- // nombrefactura = models.CharField(max_length=120)
- // userobj = models.ForeignKey('User')
- // ... etc etc
- // def get_nombrecorto(self):
- // return self.nombrefantasia[0:10]
- //
- // Obviamente ese ForeignKey tambien tiene sus propios atributos, que tambien
- // mediante definicion en el format_cache podemos acceder
- //
- // 'userprofile': {'fields': ['cedula', 'nombrefantasia'],
- // 'methods': ['get_nombrecorto'],
- // 'foreign_fields': ['userobj__username','userobj__password']
- // }
- //
- // Entonces tambien tendremos disponibles los ForeignKeys en el front-end
- //
- // Ahora, que pasa si nuestro modelo es tan grande y no queres definir todos los atributos
- // o queres hacer una definicion independiente de la habitual
- // Es cuestion de nombrar la llave de otra forma, obviamente es buena practica tener como prefijo
- // el nombre del modelo en minusculas
- //
- // En el siguiente ejemplo vemos la definicion del anterior 'userprofile' y otro que llamamos 'userprofile_lite'
- // En donde el segunto no tiene definido los metodos y el nombre fantasia
- //
- // 'userprofile': {'fields': ['cedula', 'nombrefantasia'],
- // 'methods': ['get_nombrecorto'],
- // 'foreign_fields': ['userobj__username','userobj__password']
- // }
- // 'userprofile_lite': {'fields': ['cedula'],
- // 'foreign_fields': ['userobj__username','userobj__password']
- // }
- //
- // Entonces lo definido en format_cache, es lo que utilizamos en "model_key"
- url: '{% url "get_jsonmodel" %}',
- data: function (params) {
- var query = {
- 'key_name': 'salamanca', //Llave para que el servidor sepa que es una fuenta no maliciosa
- 'app_name': 'finance_man', //nombre del paquete donde esta el modelo
- 'model_name': 'UserProfile', //Como se llama el modelo, tal cual como esta en models.py
- 'model_key': 'userprofile_lite', //definicion en format_cache (un modelo puede tener varias definiciones), tal cual como esta en format_cache
- // despues de esto, lo que se define son atributos para query
- // por ejemplo abajo ponemos que solo queremos traer los aprobados
- // esto depende de los atributos del modelo
- 'aprobado_050': 1,
- //aqui decimos que busque en los atributos nombrefantasia o clientecod
- // OJO: Los atributos del modelo son nombrefantasia y clientecod
- // Osea si abres models.py y te vas al modelo veras solamente como atributos lo dicho arriba
- // or_ = Es una condicionante del sistema para hacer queries tipo OR
- // __icontains = Es una condicionante del sistema para hacer queries tipo like
- 'or_nombrefantasia__icontains': params.term,
- 'or_clientecod__icontains': params.term
- };
- return query;
- },
- //Procesamos los datos recibidos para mostrarlos en el select2
- // Siempre los datos recibidos son una array
- //Siguiendo el ejemplo de UserProfile si buscamos por ejemplo pedroleguizamon, y tienendo en cuenta que estamos
- // usando la definicion userprofile_lite, eL servidor nos enviara
- //
- // [{'_id': 8989898,
- // 'cedula': 2463986,
- // 'userobj__username': 'pedroleguizamon',
- // 'userobj__password': 'df7n21k18978'
- // }]
- //
- // En cambio si utilizamos la definicion userprofile, nos devolvera
- // [{'_id': 8989898,
- // 'cedula': 2463986,
- // 'nombrefantasia': 'Miers Leguizamon, Pedro Julian',
- // 'userobj__username': 'pedroleguizamon',
- // 'userobj__password': 'df7n21k18978',
- // 'get_nombrecorto': 'Miers Legu'
- // }
- // ]
- // FIJESE como siempre trae el atributo "_id", este es el PRIMARY KEY del modelo
- processResults: function (data) {
- sdata = [];
- //Parseamos (convertimos) a un objecto el json
- dataj = JSON.parse(data);
- //Lo iteramos
- for (idx in dataj) {
- sdobj = dataj[idx];
- //Pontemos los atributos que vamos a utilizar para que los muestre en el select2
- cliente = sdobj.nombrefantasia + '[' + sdobj.cedula + ']';
- sdata.push({id: sdobj.cedula, text: cliente});
- }
- //Devolvemos los resultados.
- //Cuando pruebas esto
- //Utiliza siempre console.log para ir viendo lo que hace el sistema
- return {results: sdata};
- }
- }
- });
- }
- //Llamamos a nuestro metodo para que ejecute en el DOM (investigar que es el DOM en html/javascript/programacion web)
- form_[lo_que_repsenta]_select();
Add Comment
Please, Sign In to add comment