Pergunta

Em um aplicativo Django Eu tenho o seguinte modelo:

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()

Quando estou tornando um compromisso, eu estou apenas colocando um marcador na posição especificada por longitude e latitude com o endereço como texto, no entanto eu preciso a latitude e longitude para fazer isso.

Atualmente, latitude e longitude devem ser inseridos manualmente no backend admin, mas abrir o Google Maps / OSM, procurando o endereço de e entrando latitude e longitude é um trabalho que não deveria ter que ser feito à mão, então eu quero para recuperá-lo através da API do Google Maps (palavra-chave geocodificação).

Idealmente, eu quero um botão "Get coordenadas" ao lado do endereço, que, quando pressionado, inicia uma solicitação de geocodificação e preenchimentos em latitude e longitude quando o endereço é inequívoca e apresenta um mapa com os resultados e preenche as coordenadas quando o usuário clica no marcador direita.

Eu sei como fazer isso, mas eu não sei como devo inserir a marcação eo código para o backend de administração.

Algumas coisas que eu já consideradas, mas não quero fazer como eles não parecem naturais ou parecem ser muito trabalho para uma tarefa tão simples:

  • colocar o código na descrição do campo de endereço em field_options em uma classe derivada de admin.ModelAdmin
  • colocar endereço de tudo relacionado em um modelo separado e usando um form personalizado (com um modelo separado
  • criar um endereço selecionador Widget
  • uso GeoDjango
Foi útil?

Solução

Existem várias maneiras de fazer isso. Você já mencionou alguns si mesmo.

Uma opção seria a de substituir o modelo para a página save em seu administrador e adicionar o código necessário para o modelo. Os meios de comunicação necessários, Javascript, CSS, etc, pode ser adicionado usando uma classe de mídia interna em sua classe ModelAdmin. Esta classe media tem dois atributos diferentes, uma tupla com folhas de estilo CSS e uma tupla com arquivos javascript

Eu acho que para mim, que a melhor opção neste caso seria um widget endereço personalizado picker como você já mencionou na sua lista de maneiras que você não quer fazê-lo.

Outras dicas

O que é essencialmente a ser tratada é de marcação do lado do cliente e javascript do lado do cliente. Sendo esse o caso, parece que o uso de uma instalação que foi projetado para lidar com aqueles que seria a escolha adequada. Eu também recomendo fazer um widget de administração personalizado. Eu usei esse padrão mesmo. Dependendo do tamanho da marcação do lado do cliente, você mesmo pode fazer uso de um modelo de Django para tornar o widget.

Como alternativa, você poderia escrever javascript não-intrusiva para re-tornar essa área da página após a página foi carregada. Neste método, você simplesmente poderia incluir esse arquivo de mídia javascript com class Media: no modelo de administração.

Este é mais como pseudo-código do que qualquer coisa, mas dá a ideia:

admin.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', ]

longo 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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top