Добавление пользовательского JS в поле администратора django - PullRequest
7 голосов
/ 29 ноября 2009

В приложении Django у меня есть следующая модель:

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

Когда я отрисовываю встречу, я просто помещаю маркер в положение, заданное долготой и широтой, с адресом в виде текста, однако для этого мне нужны широта и долгота.

В настоящее время широту и долготу необходимо вводить вручную в бэкэнде администратора, но открытие Google Maps / OSM, поиск адреса и ввод широты и долготы - это работа, которую не нужно делать вручную, поэтому я хочу чтобы получить его через API Карт Google (ключевое слово Geocoding).

В идеале мне нужна кнопка «Получить координаты» рядом с адресом, которая при нажатии запускает запрос геокодирования и заполняет широту и долготу, когда адрес однозначный, и представляет карту с результатами и заполняет координаты. когда пользователь нажимает на правый маркер.

Я знаю, как это сделать, но я не уверен, как мне вставить разметку и код в административный сервер.

Некоторые вещи, которые я уже рассмотрел, но не хочу делать, поскольку они не кажутся естественными или кажутся слишком трудоемкими для такой простой задачи:

  • помещает код в описании поля адреса в field_options в классе, производном от admin.ModelAdmin
  • размещение всего адреса, относящегося к отдельной модели и использование пользовательского form (с отдельным шаблоном
  • создать виджет выбора адреса
  • использовать GeoDjango

Ответы [ 2 ]

19 голосов
/ 30 ноября 2009

В первую очередь речь идет о разметке на стороне клиента и JavaScript на стороне клиента. В таком случае может показаться, что использование средства, предназначенного для их обработки, будет правильным выбором. Я также рекомендовал бы сделать собственный виджет администратора. Я сам использовал этот шаблон. В зависимости от размера разметки на стороне клиента вы даже можете использовать шаблон Django для визуализации виджета.

В качестве альтернативы вы можете написать неинтрузивный javascript для повторного рендеринга этой области страницы после загрузки страницы. В этом методе вы можете просто включить этот медиа-файл javascript с class Media: в модель администратора.

Это больше похоже на псевдокод, чем на что-либо, но дает идею:

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

давно 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
}
3 голосов
/ 29 ноября 2009

Есть несколько способов сделать это. Вы уже упомянули некоторые из них.

Можно было бы переопределить шаблон для страницы сохранения в вашем администраторе и добавить необходимый код в шаблон. Необходимые медиа, Javascript, Css и т. Д. Могут быть добавлены с использованием внутреннего класса Media в вашем классе ModelAdmin. Этот класс мультимедиа имеет два разных атрибута: кортеж с таблицами стилей CSS и кортеж с файлами javascript

Я думаю для себя, что лучшим вариантом в этом случае будет пользовательский виджет выбора адреса, как вы уже упоминали в своем списке способов, которые вы не хотите делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...