2009-08-26 8 views
8

Chciałem stworzyć aplikację Django i jedną z funkcji, które chciałbym mieć, są dynamiczne rozwijane listy ... specjalnie dla marek i modeli pojazdów ... wybierając konkretny make zaktualizuje listę modeli tylko modelami, które podpadają pod tą markę .... Wiem, że jest to możliwe w javascript lub jQuery (to byłby mój najlepszy wybór, jeśli ktokolwiek ma odpowiedź), ale nie wiem jak iść o tym.Dynamiczna lista rozwijana Django z bazy danych

Chciałbym również, aby marka, model, rok i seria były wspólne, a pozostałe atrybuty, takie jak kolor, transmisja itd., Są zmiennymi, więc wystarczy wprowadzić markę, model, rok i serię tylko dla nowy pojazd. Wszelkie pomysły będą wysoko cenione.

Odpowiedz

9

Trzy rzeczy, o których wspominasz, że są wspólne, marka, model, rok, byłyby 3 wartościami wejściowymi. Po przekazaniu serwerowi obiekt zawierający szczegóły zostanie zwrócony na stronę wywołującą. Ta strona przeanalizuje szczegóły obiektu (przy użyciu JavaScript) i zaktualizuje interfejs użytkownika, aby wyświetlić je użytkownikowi.

Ze strony Django potrzebne są urządzenia do pobierania 3 wejść i zwracania danych wyjściowych. Ze strony klienta musi istnieć możliwość przekazania 3 wejść do serwera, a następnie odpowiednie przeanalizowanie odpowiedzi serwera.

Istnieje framework REST API dla Django, który ułatwia dodanie "api" wspomnianego powyżej - Piston. Używając tłoków, wystarczy utworzyć adres URL dla tego zasobu, a następnie dodać program obsługi, aby go przetworzyć. (Będziesz jeszcze trzeba przejrzeć dokumentację tłok, ale to powinno dać ci pomysł, jak to wygląda)

urls.py: 
vehicle_details = Resource(handler=VehicleDetails) 
url(r'^vehicle/(?<make>.*)/(?<model>.*)/(?<year\d{2,4}/(?P<emitter_format>[a-z]{1,4}), vehicle_details, name='vehicle_details'), 

handler.py: 
class VehicleDetails(BaseHandler): 
    methods_allowed = ('GET',) 
    model = Vehicles #whatever your Django vehicle model is 

    def read(self, request, *args, **kwargs): 
     # code to query the DB and select the options 
     # self.model.objects.filter()...    
     # Build a custom object or something to return 

     return custom_object 

To po prostu ustawia www.yoursite.com/vehicle/[make]/ url [model]/[rok]/json w celu zwrócenia niestandardowego obiektu danych w JSON do przeanalizowania przez jquery.

Po stronie klienta można użyć jquery do skonfigurowania zdarzenia (bind), aby po wybraniu wszystkich 3 dropdownów wykonywał on znak $ .get() na adres URL api. Kiedy otrzyma ten wynik z powrotem, przekazuje go do analizatora składni JSW JSON i nadaje obiekt niestandardowy jako obiekt javascript. Obiekt ten mógłby następnie zostać użyty do wypełnienia większej liczby rozwijanych menu.

(Big ostrzeżenie, po prostu pisał poza czubek mojej głowy, więc to nie jest przeznaczone do kopiowania i wklejania. To tylko dla ogólnej idei.)

<script type="text/javascript"> 

    // On document load 
    $(function() { 
     $('#dropdown_make').bind('change', checkForValues()); 
     $('#dropdown_model').bind('change', checkForValues()); 
     $('#dropdown_year').bind('change', checkForValues()); 
    }); 

    function checkForValues() { 
     if ($('#dropdown_make').val() && $('#dropdown_model').val() && $('#dropdown_year').val()) 
      updateOptions();   
    } 

    function updateOptions() { 
     url = '/vehicle/'; 
     url += $('#dropdown_make').val() + '/'; 
     url += $('#dropdown_model').val() + '/'; 
     url += $('#dropdown_year').val() + '/'; 
     url += 'json/'; 
     $.get(url, function(){ 
      // Custom data object will be returned here 
     }) 
    } 
</script> 

0

To niesamowite: Dynamic Filtered Drop-Down Choice Fields With Django

Jego pytanie:

„Oto sytuacja: Mam bazę danych z samochodu marek i modeli Gdy użytkownik wybierze markę, chcę. zaktualizować listę modeli tylko modelami związanymi z tą marką ... Dlatego chcę używać Ajax do zapełniania danych. "

Nie jesteś tym samym gościem? :)

+0

Nie ten sam facet ... po prostu próbujemy rozwiązać ten sam problem ... dzięki za link, wygląda mi to na dobry początek. –

+2

Jestem facetem, a to jest niesamowite :) – Dustin