2009-11-29 32 views
6

W aplikacji django Mam następujący model:Dodawanie niestandardowego JS do pola django admina

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

Kiedy jestem renderingu spotkanie, jestem po prostu umieszczenie znacznika w miejscu określonym przez geograficznej i szerokość geograficzna z adresem jako tekstem, jednak potrzebuję szerokości i długości geograficznej, aby to zrobić.

Obecnie szerokość i długość geograficzną należy wprowadzić ręcznie w panelu administracyjnym, ale otwieranie Map Google/OSM, wyszukiwanie adresu i podanie szerokości i długości geograficznej to praca, której nie należy wykonywać ręcznie, więc chcesz pobrać go za pomocą interfejsu Google Maps API (geokodowanie słów kluczowych).

Idealnie, chcę przycisk "Pobierz współrzędne" obok adresu, który po naciśnięciu uruchamia żądanie geokodowania i wypełnia szerokość i długość geograficzną, gdy adres jest jednoznaczny i przedstawia mapę z wynikami i wypełnia koordynuje, gdy użytkownik kliknie właściwy znacznik.

Wiem, jak to zrobić, ale nie jestem pewien, jak powinienem wstawić znacznik i kod do zaplecza administracyjnego.

pewne rzeczy już uznanych, ale nie chcą zrobić, ponieważ nie wydaje się naturalne lub wydają się być zbyt dużo pracy dla takiego prostego zadania:

  • umieszczenie kodu w opisie pola adresu w w field_options w klasie pochodnej od admin.ModelAdmin
  • umieszczenie adresu wszystko związane w odrębnym modelu i przy użyciu niestandardowych form (z osobnym szablonie
  • utworzyć widget adres kompletacji
  • nas e GeoDjango

Odpowiedz

3

Istnieje kilka sposobów na zrobienie tego. Wspomniałeś już o sobie.

Opcja polegałaby na zastąpieniu szablonu strony zapisywania w administratorze i dodaniu potrzebnego kodu do szablonu. Potrzebne media, Javascript, Css itp. Można dodać za pomocą wewnętrznej klasy Media w klasie ModelAdmin. Ta klasa mediów ma dwa różne atrybuty: krotkę z arkuszami stylów CSS i krotkę z plikami javascript.

Myślę, że najlepszą opcją w tym przypadku będzie niestandardowy widget wyboru adresu, o którym już wspomniano na liście. sposobów, w jakie nie chcesz tego robić.

17

Najważniejszymi czynnościami, które należy wykonać, są znaczniki po stronie klienta i javascript po stronie klienta. W tym przypadku wydaje się, że właściwym rozwiązaniem byłoby skorzystanie z obiektu zaprojektowanego do ich obsługi. Polecam również tworzenie niestandardowego widżetu administratora. Użyłem tego wzoru sam. W zależności od wielkości znaczników po stronie klienta można nawet użyć szablonu Django do renderowania widgetu.

Alternatywnie można napisać nieinwazyjny javascript, aby ponownie renderować ten obszar strony po załadowaniu strony. W tej metodzie można po prostu uwzględnić ten plik multimedialny javascript pod numerem class Media: w modelu administratora.

To jest bardziej jak pseudo-kodu, niż czegokolwiek, ale daje pomysł:

administratora.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 
} 
+2

folderu Media jest ważny folderu, ale myślę, że jest lepiej STATIC_URL jak ten static_url = getattr (ustawienia, „STATIC_URL ','/static/') js = [static_url +' path/to/my/custom/file.js ',] – elin3t

Powiązane problemy