2009-11-29 19 views
6

En una aplicación Django tengo el siguiente modelo:Adición de encargo JS a un campo Django administrador

class Appointment(models.Model): 
    #some other fields 
    #address fields 
    zipcode=models.CharField(max_length=5) 
    address=models.CharField(max_length=120) 
    latitude=models.FloatField() 
    longitude=models.FloatField() 

cuando estoy haciendo una cita, sólo estoy poniendo un marcador en la posición especificada por longitud y latitud con la dirección como texto; sin embargo, necesito la latitud y la longitud para hacerlo.

Actualmente, la latitud y la longitud tienen que ingresarse manualmente en el administrador backend, pero abrir Google Maps/OSM, buscar la dirección e ingresar latitud y longitud es un trabajo que no debería hacerse a mano, entonces desea recuperarlo a través de la API de Google Maps (palabra clave Geocodificación).

Idealmente, quiero un botón "Obtener coordenadas" junto a la dirección que, cuando se presiona, inicia una solicitud de geocodificación y rellena la latitud y longitud cuando la dirección no es ambigua y presenta un mapa con los resultados y rellena el coordina cuando el usuario hace clic en el marcador correcto.

Sé cómo hacer eso, pero no estoy seguro de cómo debo insertar el marcado y el código en el back-end de administración.

Algunas cosas que ya considerados, pero no quiere hacer, ya que no parecen naturales o parecen ser demasiado trabajo para una tarea tan sencilla:

  • poner el código en la descripción del campo de dirección en field_options en una clase derivada de admin.ModelAdmin
  • poner todo lo relacionado en la dirección de un modelo separado y usando un encargo form (con una plantilla separada
  • crear un widget de dirección captadora
  • nos
  • e GeoDjango

Respuesta

3

Existen varias formas de hacerlo. Usted ya mencionó algo usted mismo.

Una opción sería anular la plantilla de la página de guardar en su administrador y agregar el código necesario a la plantilla. Los medios necesarios, Javascript, Css, etc., podrían agregarse usando una clase Media interna en su clase ModelAdmin. Esta clase de medios tiene dos atributos diferentes, una tupla con hojas de estilo CSS y una tupla con archivos Javascript

Creo que la mejor opción en este caso sería un widget selector de direcciones personalizado como ya mencionas en tu lista de formas en que no quieres hacerlo.

17

Lo que se trata principalmente es el marcado del lado del cliente y el javascript del lado del cliente. Siendo el caso, parecería que usar una instalación diseñada para manejarlos sería la elección correcta. También recomendaría hacer un widget de administración personalizado. He usado este patrón yo mismo. Dependiendo del tamaño del marcado del lado del cliente, incluso puede utilizar una plantilla de Django para representar el widget.

Como alternativa, puede escribir javascript no intrusivo para volver a representar esa área de la página después de que la página se haya cargado. En este método, puede simplemente incluir ese archivo javascript multimedia con class Media: en el modelo de administración.

Esto es más como pseudo-código que nada, pero le da la idea:

administrador.py

class AppointmentAdmin(admin.ModelAdmin): 
    # ... 

    class Media: 
     from django.conf import settings 
     media_url = getattr(settings, 'MEDIA_URL', '/media') 
     js = [ media_url+'/admin/long-lat-render.js', ] 

largas-LAT-render.js

// Written for jQuery 
$(function(){ 
    // on page load... 

    $('#_LongitudeTag').html(''); 

    var getCoordButton = $('<button id="get-coords"></button>'); 
    $('#_LongitudeTag').append(getCoordButton); 

    addGMap($('#_LongitudeTag').get(0)); 
}); 

function addGMap(element) { 
    // do whatevers 
} 
+2

carpeta Media es una carpeta válida, pero creo que es mejor STATIC_URL como esto static_url = getattr (configuración, 'STATIC_URL ','/static/') js = [static_url +' ruta/a/mi/personalizado/archivo.js ',] – elin3t

Cuestiones relacionadas