2017-05-31 2 views
0

Ich habe Django-Website, die Ajax verwendet. Wenn ich Javascript innerhalb des HTML-Dokuments <script>...</script> benutze, funktioniert alles gut. Aber wenn ich javascript in eine separate Datei verschiebe alles (alles Javascript) funktioniert super, aber ajax. Bei jeder Ajax-Anfrage bekomme ich: 404 (Not Found) und es wird immer die Zeile des Dokuments angezeigt, in der Ajax startet. Meine Urls sind wie folgt aus:Django Ajax würde nicht funktionieren, wenn in separaten Datei

url(r'^(?P<letnik_id>[1-4])/(?P<classes_id>[A-G])/(?P<subject_id>[\w\-]+)/dodaj$', views.create_exam, name="create_exam"), 

In Ansichten:

def create_exam(request, letnik_id, classes_id, subject_id): 
... 

und Ajax url:

$.ajax({ 
    url: "{% url 'create_exam' letnik_id=letnik_id classes_id=classes_id subject_id=subject_id %}", 
... 

Vielleicht, wenn in separaten Datei die {% url 'create_exam' letnik_id=letnik_id classes_id=classes_id subject_id=subject_id %} nicht funktionieren? Aber gibt es eine andere Möglichkeit, auf die URL zu verweisen? Was mache ich falsch?

Antwort

2

Sie haben Ihre eigene Frage beantwortet. In einer separaten JS-Datei funktioniert ein Django-Template-Tag nicht. Es funktioniert nur mit den Vorlagen, die von einer Django-Ansicht gerendert werden. Möglicherweise müssen Sie einen anderen Weg finden.

Ich bin nicht sicher, ob dies der beste Ansatz ist, aber Sie können eine globale js-Variable in der Vorlage mit der URL deklarieren und dann in Ihrer js-Datei verwenden. Ich weiß wirklich nicht, ob es der beste Ansatz ist, aber ich denke, es wird funktionieren.

in Ihrem HTML, bevor Sie die JS-Datei importieren, bevor Sie die Variable deklarieren:

MY_URL = "{% url 'create_exam' letnik_id=letnik_id classes_id=classes_id subject_id=subject_id %}"; 
<script src="myscripts.js"></script> 
+1

das ist keine schlechte Idee, obwohl ich bereits das Problem gelöst habe, aber nicht für zwei Tage. Ich habe gerade verwendet: window.location.Patchname + "create_exam", da alle Parameter bereits in der URL waren. Trotzdem danke! – csserrs

1

Was ist los:

Sie versuchen, verwenden, um eine Django Template-Tag ({% url ... %}) außerhalb einer Vorlage.

Fixing es:

Sie so etwas wie auskippen eine Reihe von Daten in Ihren HTML tun können, und es an das Fenster-Objekt in der

<script> 
window.page_data = { 
    someUrl: {% url ... %} 
}; 
</script> 

dann Ihre anderen Skripten verwenden, den Zugriff auf den Browser anhängen Daten aus dem Fenster ...

$.ajax(window.page_data.someUrl) 

Oder Sie die URL in dem Markup mit einem Datenattribut einbetten können

<div data-url="{% url ... %}"> 

Dann extrahieren Sie es aus dem Element in Javascript.

Wenn Ihr Projekt an Komplexität zunimmt, sollte Ihre API die Daten weitergeben, die Sie für die Ausführung jeder Aktion auf einer Ressource benötigen. Achten Sie jedoch darauf, Ihren Client unnötig mit Ihrem Server zu verbinden. Das heißt, URLs nicht hart codieren, da sie sich ändern können, was zu unerwarteten Brüchen führt. Wenn Sie etwas hart codieren müssen, stellen Sie sicher, dass Sie es nur an einer Stelle tun und notieren Sie sich irgendwo, um das irgendwann zu beheben.

Verwandte Themen