LAVAGGIO Url Django Javascript

Sto usando Django su Appengine. Sto usando django reverse() funzione ovunque, a mantenere tutto il più ASCIUTTO possibile.

Tuttavia, sto avendo problemi di applicazione di questo mio lato client javascript. C’è un JS classe che carica alcuni dati in base a un passato in ID. C’è un modo standard per non inserire l’URL di questo tipo di dati dovrebbe venire da?

var rq = new Request.HTML({
    'update':this.element,
}).get('/template/'+template_id+'/preview'); //The part that bothers me.
  • Mi piacerebbe vedere una discussione più di questo. Penso anche a un url risoluzione di callback è troppo pesante. Qualcuno ha trovato altro su questo argomento?
  • Domanda simile qui: stackoverflow.com/questions/1795701/…
  • Strano, non ho trovato che uno al momento ho postato il mio. Nessuno ha risposte soddisfacenti però eh.
InformationsquelleAutor noio | 2010-04-27

 

9 Replies
  1. 33

    C’è un altro metodo, che non richiede di esporre l’intera struttura di url o richieste ajax per la risoluzione di ogni url. Mentre non è davvero bella, si batte gli altri, con semplicità:

    var url = '{% url blog_view_post 999 %}'.replace (999, post_id);

    (blog_view_post url non deve contenere la magia 999 numero di loro, naturalmente.)

    • Ho fatto questo e ho sentito un po ‘sporco, ma vedendo qui mi fa sentire un teensy po’ meglio su questo.
    • Tenete a mente il previsto tipi di caratteri per il parametro URL. Se il parametro URL accetta cifre questo funziona, ma non se si aspetta solo lettere. Vorrei anche suggerire l’utilizzo di alcune 000, dato che non dovrebbe esistere (per un oggetto.id, almeno)
    • Questo è sporca. Se avete intenzione di utilizzare l’url in javascript, meglio farlo accettare i parametri GET e quindi non hai bisogno di sostituire. GET è stato uno standard per età e per tutti i framework javascript per sostenere il passaggio di una struttura di dati che sarà trasformata in parametri (sfuggito correttamente troppo a differenza di questo), e si legge meglio.
    • Se si passa 000 Django, è reso nell’URL come 0. @dalore Un problema con l’utilizzo di parametri GET, invece, è il RIPOSO Url ad esempio, /api/model/3/ è un URL diverso per /api/model/ ed è conveniente e in ordine per separarli al dispatcher.
    • ma django url parametri per i modelli di django. Url Javascript utilizzare i parametri GET. Se si tenta l’diversamente sei costretto a fare brutti sporchi trucchi come questo. Si potrebbe creare un django vista che prende automaticamente i parametri GET e li mette in kwargs in modo che la vista non importa se si tratta di un arg o un django url arg. Il Bonus è che OTTENERE gli argomenti possono essere specificati in qualsiasi ordine. Pensare a loro come python **kwargs, e l’url args come *args. E se javascript è accedere al tuo url, non c’è bisogno di nizza url
  2. 10

    Avendo appena lottato con questo, mi si avvicinò con una diversa soluzione.

    Nel mio caso, ho voluto un JS esterno script per richiamare una chiamata AJAX il clic su un pulsante (dopo aver fatto qualche altro trattamento).

    In HTML, ho usato un HTML-5 attributo personalizzato così

    <button ... id="test-button" data-ajax-target="{% url 'named-url' %}">

    Quindi, in javascript, semplicemente non

    $.post($("#test-button").attr("data-ajax-target"), ... );

    Che significava Django sistema di template di fatto tutte le reverse() logica per me.

    • +1 Questo è l’approccio che mi stava prendendo in considerazione prima di cercare ciò che tutti gli altri stava facendo. Mi sembra la soluzione ideale per me, a meno che il supporto legacy è un problema. Non certo perché non ha più trazione, qui.
    • Questo è davvero semplice e il tuo esempio era esattamente quello che stavo cercando di fare
  3. 8

    La soluzione più ragionevole sembra essere il passaggio di un elenco di Url in un file JavaScript, e avere un JavaScript equivalente di reverse() disponibile sul client. L’unica obiezione potrebbe essere che l’intera struttura di URL è esposto.

    Qui è una funzione (da questo domanda).

  4. 4

    Cosa buona è quello di assumere che tutti i parametri da JavaScript a Django verrà passato come richiesta.OTTENERE o richiesta.POST. Si può fare che, nella maggior parte dei casi, perché non c’è bisogno di nizza url formattato per JavaScript query.

    Quindi solo problema è quello di passare url da Django a JavaScript. Ho pubblicato biblioteca per che. Esempio di codice:

    urls.py

    def javascript_settings():
        return {
            'template_preview_url': reverse('template-preview'),
        }

    javascript

    $.ajax({
      type: 'POST',
      url: configuration['my_rendering_app']['template_preview_url'],
      data: { template: 'foo.html' },
    });
  5. 4

    Simili a Anatoly risposta, ma un po ‘ più flessibile. Mettere in cima alla pagina:

    <script type="text/javascript">
    window.myviewURL = '{% url myview foobar %}';
    </script>

    Allora si può fare qualcosa di simile

    url = window.myviewURL.replace('foobar','my_id');

    o qualsiasi altra cosa. Se l’url contiene molteplici variabili, basta eseguire il metodo di sostituzione più volte.

  6. 2

    Mi piace Anatoly idea, ma penso che utilizzando una specifica intero è pericoloso. Io di solito desidera specificare un dire un id di oggetto, che sono sempre tenuti a essere positivo, quindi la uso solo numeri interi negativi come segnaposto. Questo significa l’aggiunta di -? per la definizione dell’url, in questo modo:

    url(r'^events/(?P<event_id>-?\d+)/$', events.views.event_details),

    Quindi posso ottenere il reverse url in un modello di scrittura

    {% url 'events.views.event_details' event_id=-1 %}

    E utilizzare replace in javascript per sostituire il segnaposto -1, in modo che nel modello scrivere qualcosa di simile a

    <script type="text/javascript">
    var actual_event_id = 123;
    var url = "{% url 'events.views.event_details' event_id=-1 %}".replace('-1', actual_event_id);
    </script>

    Questo si estende facilmente a più argomenti troppo, e la mappatura di un particolare argomento è visibile direttamente nel template.

    • In realtà, credo che questo è molto più pericoloso… 1) Negativo Id sono ora ammessi nell’URL il che significa che può essere superato nel vostro punto di vista; si avrà bisogno di maggiore logica per verificarlo 2) “-1” è molto più probabile per mostrare l’URL come parte della stringa statica di “999”. Il motivo che “999” funziona perché non c’è nient’altro nella parte statica dell’URL che in realtà è “999”. Non importa che si tratta di un documento di identità valido, purché esso viene sostituito senza ambiguità.
    • Se è un oggetto ID, probabilmente si dovrebbe essere utilizzando get_object_or_404 comunque per l’utente finale vedrà la stessa 404, come se il modello di URL non accettare il negativo
  7. 1

    Ho trovato un trucco semplice per questo. Se l’url è uno schema come questo:

    "xyz/(?P<stuff>.*)$"

    e si desidera invertire in JS senza in realtà fornire roba (rinviando alle JS fase di esecuzione per fornire questo) – è possibile effettuare le seguenti operazioni:

    Alterare la vista per dare al parametro un valore predefinito di nessuno, e l’impugnatura, che risponde con un errore, se non il suo set:

    views.py

    def xzy(stuff=None):
      if not stuff:
        raise Http404
      ... < rest of the view code> ...
    • Modificare l’URL partita per fare il parametro opzionale: "xyz/(?P<stuff>.*)?$"
    • E nel modello codice js:

      .ajax({
      url: “{{ url vista.xyz }}” + js_stuff,
      … …
      })

    Il modello generato dovrebbe quindi avere l’URL senza il parametro in JS, e in JS si può semplicemente concatenare il parametro(s).

  8. 0

    Una delle soluzioni che mi è venuto è quello di generare gli url sul backend e passarli al browser in qualche modo.

    Potrebbe non essere adatto in ogni caso, ma ho una tabella (popolata con l’AJAX) e cliccando su una riga deve prendere l’utente per l’ingresso singolo da questa tabella.

    (Sto usando django-restframework e Datatable).

    Ogni voce dall’AJAX ha la url allegato:

    class MyObjectSerializer(serializers.ModelSerializer):
        url = SerializerMethodField()
        # other elements
    
        def get_url(self, obj):
           return reverse("get_my_object", args=(obj.id,))

    sul caricamento ajax ogni url è collegato come attributo di dati per riga:

    var table = $('#my-table').DataTable({
       createdRow: function ( row, data, index ) {
          $(row).data("url", data["url"])
       }
    });

    e fare clic su utilizziamo questi dati attributo url:

    table.on( 'click', 'tbody tr', function () {
      window.location.href = $(this).data("url");
    } );
  9. 0

    Utilizzare questo pacchetto: https://github.com/ierror/django-js-reverse

    Avrete un oggetto da un JS con tutti gli url definiti in django. È l’approccio migliore che ho trovato finora.

    L’unica cosa che dovete fare è aggiungere il js generato nella testa del tuo modello di base ed eseguire un comando per la gestione di aggiornare il js generato ogni volta che si aggiunge un url

Lascia un commento