2014-10-21 4 views
8

Sto usando Django Rest Framework con React.js. La mia pagina mostra il profilo di un utente, utilizzando un'API come questo:Come inserire una variabile modello Django in uno script React?

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

voglio impostare dinamicamente l'URL per il reagire richiesta AJAX per includere la corretta pk, in modo che richiede informazioni e la correttezza dell'utente dal server.

Potrei usare una funzione come window.location.href e inserire il numero dalla fine, ma c'è un modo per farlo passando il pk direttamente dal server, cioè usando una variabile di template?

+0

O il vostro codice react.js potrebbe richiedere l'id durante il suo processo di login, farlo tramite JSON e conservarla per tutta la durata della richiesta ? In genere mi sento che se stai interagendo con JSON e implementando un'API, dovrebbe essere solo questa, un'API, non una cosa basata su un modello. – jvc26

+0

@ jvc26 in questo momento il mio codice di reazione non utilizza un router, è solo una funzione che mostra i dettagli per un particolare profilo. Il resto della pagina è django templating. La mia soluzione attuale è di aggiungere un tag di dati html5 all'elemento contenente il codice di risposta e inserire l'url lì. Non molto carina ma per ora funziona. – YPCrumble

risposta

12

Quando si esegue il rendering del componente, è necessario passare il pk come sostegno.

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

Un'alternativa migliore potrebbe essere semplicemente recuperare l'utente e quindi eseguire il rendering del componente. Ad esempio, con superagent:

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

Con browserify, è possibile includere i dati in un tag script, e l'uso che nel codice:

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

o esportare moduli usando la bandiera -r (.require() nell'api).

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

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

e quindi utilizzare i moduli in normali tag script

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

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

Hm - in questo momento utilizzo un file chiamato "app.js" creato con browserify. Lo chiamo dal mio modello django come '' quindi non penso che questa soluzione funzioni. C'è un'altra soluzione? – YPCrumble

+1

Ho aggiunto alcuni esempi per l'utilizzo con browserify (e aggiornato per essere compatibile con 0.12/0.13). – FakeRainBrigand

+0

Fantastico, grazie! – YPCrumble