2012-11-12 10 views
7

Istnieje wiele postów i stron omawiających użycie Django i AJAX, a przeczytałem setki w ciągu minionego dnia lub szukając odpowiedzi na to pytanie. Szybki przegląd:Używanie znacznika adresu URL Django w połączeniu AJAX

maja przykłady pokazują zakodowane URL tak:

$.post("/projects/create/", {"name" : name}, function(data) {... 

lub niektóre użyć szablon URL, ale bez parametrów:

$.post("{% url create_project %}", {"name" : name}, function(data) {... 

jednak Chciałbym dodać parametr adresu Django w adresie URL. Oto moja definicja url:

url(r'ajax/entity_name/(?P<pk>\w+)/$',EntityAjaxView.as_view(),name='entity_name'), 

Tak, używam pogląd oparty klasy i jest ona oparta na DetailView. Ten widok domyślnie wyświetla wartość pk podaną w adresie URL, a w szablonie normalnym użyłbym:

{% url entity_name id_number %} 

, aby podać link. W moim kodzie chcę pobrać wartość wprowadzoną w polu wejściowym dla wartości pk. Oto fragment mojego kodu JavaScript (które nie działa):

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val() 
$.ajax({ 
    type: "GET", 
url: '{% url entity_name id_number %}', 

Więc moje pytanie brzmi, czy mogę użyć adresu URL szablonu tag z wartością z pola tekstowego?

(wiem, że mogę używać POST zamiast GET i przekazać ID_Number w danych POST, ale to nie będzie dobrze współpracować z DetailView.)

Dzięki z góry za pomoc.

Odpowiedz

10

Django to aplikacja po stronie serwera. JavaScript jest po stronie klienta. Szablony Django są renderowane na serwerze, więc {% url entity_name id_number %} jest oceniany po stronie serwera, a następnie jego wartość jest zwracana do klienta. Właśnie z tego powodu niemożliwe jest łączenie szablonów Django z javascript. Jest jednak kilka rzeczy, które możesz zrobić, aby rozwiązać swój problem.

Ponieważ wywołujesz wywołanie ajax, a wywołanie ajax zależy od niektórych danych wprowadzonych przez użytkownika, zwykle najlepszą drogą do wysłania przez klienta dowolnego typu danych wprowadzanych przez użytkownika jest użycie querystring (rzecz po ? w URL) lub wysyłając dane POST. Najprościej jest więc zmienić adres URL, aby nie zawierał adresu URL w adresie pk, ale aby uzyskać go jako część danych GET lub POST.

url(r'ajax/entity_name/$', EntityAjaxView.as_view(), name='entity_name'), 

i widok (przepraszam nie jestem zaznajomiony z widokiem na bazie klasy):

def entity_name(request): 
    pk = request.GET.get('pk') 
    ... 

To wydaje mi się być najbardziej eleganckie rozwiązanie. Jeśli jednak koniecznie musisz utworzyć adres URL po stronie klienta, możesz wygenerować URL szablonu po stronie serwera, a następnie zastąpić wszystkie potrzebne części po stronie klienta, aby uzyskać pełny adres URL. Wymaga to jednak większej konserwacji i dlatego jest bardziej podatny na błędy. Prosty przykład js tego podejścia:

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val(), 
    url = '{% url entity_name 0 %}'.replace('0', id_number); 
$.ajax({ 
    type: "GET", 
    url: url, 
    ... 
}); 
+0

Dwie dobre opcje. Dzięki! – Dashdrum

Powiązane problemy