2014-10-21 4 views
8

Ich verwende Django Rest Framework mit React.js. Meine Seite zeigt ein Benutzer-Profil, ein api wie folgt aus:Wie füge ich eine Django-Vorlagenvariable in ein React-Skript ein?

http://localhost:8000/api/profile/[pk]

ich die URL wollen für die dynamisch eingestellt reagieren Ajax-Anforderung die richtige Stück zu schließen, so dass es die Informationen des korrekten Benutzer fordert von der Server.

Ich könnte eine Funktion wie window.location.href verwenden und die Zahl vom Ende abholen, aber gibt es eine Möglichkeit, dies zu tun, indem Sie das pk direkt vom Server übergeben, d.

+0

Oder Ihr react.js Code könnte die ID während des Anmeldeprozesses verlangen, es über JSON erhalten und speichern sie während der Dauer des Antrags ? Ich habe generell das Gefühl, wenn Sie mit JSON interagieren und eine API implementieren, sollte es nur eine API sein, keine Template-Sache. – jvc26

+0

@ jvc26 im Moment verwendet mein reactive Code keinen Router, es ist nur eine Funktion, die Details für ein bestimmtes Profil anzeigt. Der Rest der Seite ist Django Templating. Meine derzeitige Lösung besteht darin, dem Element, das den reaktiven Code enthält, ein html5-Daten-Tag hinzuzufügen und die URL dorthin zu setzen. Nicht sehr hübsch, aber für jetzt arbeiten. – YPCrumble

Antwort

12

Wenn Sie die Komponente rendern, sollten Sie den PK als Prop übergeben.

<script> 
React.render(React.createElement(Profile, { 
    userId: "{{ userId }}", 
    urlPrefix: "/api/profile/" 
}), element); 
</script> 

Eine bessere Alternative könnte sein, einfach den Benutzer zu holen und dann die Komponente zu rendern. Zum Beispiel mit Superagenten:

superagent.get('/api/profile/{{ userId }}', function(res){ 
    React.render(React.createElement(Profile, 
     {user: res.body} 
    ), element); 
}); 

Mit browserify können Sie entweder enthalten Daten in einem Skript-Tag, und verwenden Sie diese in Ihrem Code:

<script>var _appData = {userId: "{{ userId }}"};</script> 

Oder Export-Module mit der -r Flagge (.require() in der API).

# sh 
browserify -r react -r src/profile.js:profile.js 

// js 
b.require('react').require('src/profile.js', {expose: 'profile.js'}); 

Und dann verwenden, um die Module in regelmäßigen Script-Tags

<script> 
var React = require('react'); 
var Profile = require('profile.js'); 

React.render(React.createElement(Profile, { 
    userId: "{{ userId }}", 
    urlPrefix: "/api/profile/" 
}), element); 
</script> 
+0

Hm - im Moment benutze ich eine Datei namens "app.js", die mit browserify erstellt wurde. Ich nenne das einfach aus meiner Django-Vorlage wie '' also glaube ich nicht, dass diese Lösung funktioniert. Gibt es eine andere Problemumgehung? – YPCrumble

+1

Ich habe einige Beispiele für die Verwendung mit browserify hinzugefügt (und aktualisiert, um 0.12/0.13 kompatibel zu sein). – FakeRainBrigand

+0

Super, danke! – YPCrumble

Verwandte Themen