Добавление пользовательского JS в поле администратора django

StackOverflow https://stackoverflow.com/questions/1816444

Вопрос

В приложении 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, поиск адреса и ввод широты и долготы - это работа, которую не обязательно выполнять вручную, поэтому я хочу получить ее через Google Maps API (геокодирование ключевых слов).

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

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

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

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

Решение

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

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

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

Другие советы

В первую очередь речь идет о разметке на стороне клиента и 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', ]

long-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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top