Why can't I use Jinja in Javascript for a django site?












0















So for those of us who use Python and Django framework to develop a website, there is this awesome tool known as jinja which can be used as a template engine. For example:



Instead of hard-coding an import like this:



<script src="assets/js/onebutton.js"></script>


We can do this:



<script src="{% static 'assets/js/onebutton.js' %}"></script>


In this case, it automatically searches for a folder named static and goes inside to look for the needed code.



But why isn't it possible to use jinja template in Javascript.



For example:



homepage.html



<script src='whatever.js'></script>
<p>Another example</p>
<button id="clickme"> click me </button>


whatever.js



$(function()
{
$('#clickme').click(function(){
$.ajax({
headers : {'X-CSRFToken': getCookie('csrftoken')},
type: "POST",
url: '{% url "func" %}', //<--Problem arise here
datatype:"json",
data: {},
success: function(data){
var new_template = '<h1> %firstmsg% </h1>';
var new_frontend = new_template.replace('%firstmsg%',data.message);
console.log(new_frontend);
document.getElementById('wor').innerHTML+=new_frontend;
}
});
}
}


Django would recognize the url in the AJAX request as /'{% url "func" %}' instead of /func



The only way to solve this is to move the entire code from whatever.js into the homepage.html in a <script></script> block.



Perhaps we need to import something for Jinja templating to work?










share|improve this question





























    0















    So for those of us who use Python and Django framework to develop a website, there is this awesome tool known as jinja which can be used as a template engine. For example:



    Instead of hard-coding an import like this:



    <script src="assets/js/onebutton.js"></script>


    We can do this:



    <script src="{% static 'assets/js/onebutton.js' %}"></script>


    In this case, it automatically searches for a folder named static and goes inside to look for the needed code.



    But why isn't it possible to use jinja template in Javascript.



    For example:



    homepage.html



    <script src='whatever.js'></script>
    <p>Another example</p>
    <button id="clickme"> click me </button>


    whatever.js



    $(function()
    {
    $('#clickme').click(function(){
    $.ajax({
    headers : {'X-CSRFToken': getCookie('csrftoken')},
    type: "POST",
    url: '{% url "func" %}', //<--Problem arise here
    datatype:"json",
    data: {},
    success: function(data){
    var new_template = '<h1> %firstmsg% </h1>';
    var new_frontend = new_template.replace('%firstmsg%',data.message);
    console.log(new_frontend);
    document.getElementById('wor').innerHTML+=new_frontend;
    }
    });
    }
    }


    Django would recognize the url in the AJAX request as /'{% url "func" %}' instead of /func



    The only way to solve this is to move the entire code from whatever.js into the homepage.html in a <script></script> block.



    Perhaps we need to import something for Jinja templating to work?










    share|improve this question



























      0












      0








      0








      So for those of us who use Python and Django framework to develop a website, there is this awesome tool known as jinja which can be used as a template engine. For example:



      Instead of hard-coding an import like this:



      <script src="assets/js/onebutton.js"></script>


      We can do this:



      <script src="{% static 'assets/js/onebutton.js' %}"></script>


      In this case, it automatically searches for a folder named static and goes inside to look for the needed code.



      But why isn't it possible to use jinja template in Javascript.



      For example:



      homepage.html



      <script src='whatever.js'></script>
      <p>Another example</p>
      <button id="clickme"> click me </button>


      whatever.js



      $(function()
      {
      $('#clickme').click(function(){
      $.ajax({
      headers : {'X-CSRFToken': getCookie('csrftoken')},
      type: "POST",
      url: '{% url "func" %}', //<--Problem arise here
      datatype:"json",
      data: {},
      success: function(data){
      var new_template = '<h1> %firstmsg% </h1>';
      var new_frontend = new_template.replace('%firstmsg%',data.message);
      console.log(new_frontend);
      document.getElementById('wor').innerHTML+=new_frontend;
      }
      });
      }
      }


      Django would recognize the url in the AJAX request as /'{% url "func" %}' instead of /func



      The only way to solve this is to move the entire code from whatever.js into the homepage.html in a <script></script> block.



      Perhaps we need to import something for Jinja templating to work?










      share|improve this question
















      So for those of us who use Python and Django framework to develop a website, there is this awesome tool known as jinja which can be used as a template engine. For example:



      Instead of hard-coding an import like this:



      <script src="assets/js/onebutton.js"></script>


      We can do this:



      <script src="{% static 'assets/js/onebutton.js' %}"></script>


      In this case, it automatically searches for a folder named static and goes inside to look for the needed code.



      But why isn't it possible to use jinja template in Javascript.



      For example:



      homepage.html



      <script src='whatever.js'></script>
      <p>Another example</p>
      <button id="clickme"> click me </button>


      whatever.js



      $(function()
      {
      $('#clickme').click(function(){
      $.ajax({
      headers : {'X-CSRFToken': getCookie('csrftoken')},
      type: "POST",
      url: '{% url "func" %}', //<--Problem arise here
      datatype:"json",
      data: {},
      success: function(data){
      var new_template = '<h1> %firstmsg% </h1>';
      var new_frontend = new_template.replace('%firstmsg%',data.message);
      console.log(new_frontend);
      document.getElementById('wor').innerHTML+=new_frontend;
      }
      });
      }
      }


      Django would recognize the url in the AJAX request as /'{% url "func" %}' instead of /func



      The only way to solve this is to move the entire code from whatever.js into the homepage.html in a <script></script> block.



      Perhaps we need to import something for Jinja templating to work?







      javascript python django frontend jinja2






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Dec 30 '18 at 19:44







      5Volts

















      asked Dec 30 '18 at 17:25









      5Volts5Volts

      7219




      7219
























          1 Answer
          1






          active

          oldest

          votes


















          2















          <script src="{% static 'assets/js/onebutton.js' %}"></script>


          In this case, it automatically searches for a folder named static and goes inside to look for the needed code.




          This is inaccurate. All it does is it converts the given path to the static path provided in your settings file like this - /static/asssets/js/onebutton.js. That is it. Django or Jinja2 doesn't go through the folder and look for the file. It doesn't even care if file exists or not.



          Later, the browser automatically fetches this file from the server when it receives the html document.





          Coming back to your original questions about why you can't use Jinja2 or Django template syntax in your JS files. Well, you can. But you'll have to render your JS files from your views.



          Now, I'm sure you're using the render function to return a template from your views. But what does it do?



          The render function converts the django specific template tags into proper html content.



          So, if you're using django's or jinja's template syntax in your js files, you'll have to render your js files too. But that seems like a bad idea. Instead, you can create some global variables in your html files, and use them in your js files.



          <!-- define required variables in template -->
          <script>
          var URL = '{% url ... %}';
          var OTHER_VARIABLE = '{{ other_variable }}';
          </script>
          <!-- include your js files -->
          <script src="/path/to/file.js"></script>





          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53979824%2fwhy-cant-i-use-jinja-in-javascript-for-a-django-site%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            2















            <script src="{% static 'assets/js/onebutton.js' %}"></script>


            In this case, it automatically searches for a folder named static and goes inside to look for the needed code.




            This is inaccurate. All it does is it converts the given path to the static path provided in your settings file like this - /static/asssets/js/onebutton.js. That is it. Django or Jinja2 doesn't go through the folder and look for the file. It doesn't even care if file exists or not.



            Later, the browser automatically fetches this file from the server when it receives the html document.





            Coming back to your original questions about why you can't use Jinja2 or Django template syntax in your JS files. Well, you can. But you'll have to render your JS files from your views.



            Now, I'm sure you're using the render function to return a template from your views. But what does it do?



            The render function converts the django specific template tags into proper html content.



            So, if you're using django's or jinja's template syntax in your js files, you'll have to render your js files too. But that seems like a bad idea. Instead, you can create some global variables in your html files, and use them in your js files.



            <!-- define required variables in template -->
            <script>
            var URL = '{% url ... %}';
            var OTHER_VARIABLE = '{{ other_variable }}';
            </script>
            <!-- include your js files -->
            <script src="/path/to/file.js"></script>





            share|improve this answer




























              2















              <script src="{% static 'assets/js/onebutton.js' %}"></script>


              In this case, it automatically searches for a folder named static and goes inside to look for the needed code.




              This is inaccurate. All it does is it converts the given path to the static path provided in your settings file like this - /static/asssets/js/onebutton.js. That is it. Django or Jinja2 doesn't go through the folder and look for the file. It doesn't even care if file exists or not.



              Later, the browser automatically fetches this file from the server when it receives the html document.





              Coming back to your original questions about why you can't use Jinja2 or Django template syntax in your JS files. Well, you can. But you'll have to render your JS files from your views.



              Now, I'm sure you're using the render function to return a template from your views. But what does it do?



              The render function converts the django specific template tags into proper html content.



              So, if you're using django's or jinja's template syntax in your js files, you'll have to render your js files too. But that seems like a bad idea. Instead, you can create some global variables in your html files, and use them in your js files.



              <!-- define required variables in template -->
              <script>
              var URL = '{% url ... %}';
              var OTHER_VARIABLE = '{{ other_variable }}';
              </script>
              <!-- include your js files -->
              <script src="/path/to/file.js"></script>





              share|improve this answer


























                2












                2








                2








                <script src="{% static 'assets/js/onebutton.js' %}"></script>


                In this case, it automatically searches for a folder named static and goes inside to look for the needed code.




                This is inaccurate. All it does is it converts the given path to the static path provided in your settings file like this - /static/asssets/js/onebutton.js. That is it. Django or Jinja2 doesn't go through the folder and look for the file. It doesn't even care if file exists or not.



                Later, the browser automatically fetches this file from the server when it receives the html document.





                Coming back to your original questions about why you can't use Jinja2 or Django template syntax in your JS files. Well, you can. But you'll have to render your JS files from your views.



                Now, I'm sure you're using the render function to return a template from your views. But what does it do?



                The render function converts the django specific template tags into proper html content.



                So, if you're using django's or jinja's template syntax in your js files, you'll have to render your js files too. But that seems like a bad idea. Instead, you can create some global variables in your html files, and use them in your js files.



                <!-- define required variables in template -->
                <script>
                var URL = '{% url ... %}';
                var OTHER_VARIABLE = '{{ other_variable }}';
                </script>
                <!-- include your js files -->
                <script src="/path/to/file.js"></script>





                share|improve this answer














                <script src="{% static 'assets/js/onebutton.js' %}"></script>


                In this case, it automatically searches for a folder named static and goes inside to look for the needed code.




                This is inaccurate. All it does is it converts the given path to the static path provided in your settings file like this - /static/asssets/js/onebutton.js. That is it. Django or Jinja2 doesn't go through the folder and look for the file. It doesn't even care if file exists or not.



                Later, the browser automatically fetches this file from the server when it receives the html document.





                Coming back to your original questions about why you can't use Jinja2 or Django template syntax in your JS files. Well, you can. But you'll have to render your JS files from your views.



                Now, I'm sure you're using the render function to return a template from your views. But what does it do?



                The render function converts the django specific template tags into proper html content.



                So, if you're using django's or jinja's template syntax in your js files, you'll have to render your js files too. But that seems like a bad idea. Instead, you can create some global variables in your html files, and use them in your js files.



                <!-- define required variables in template -->
                <script>
                var URL = '{% url ... %}';
                var OTHER_VARIABLE = '{{ other_variable }}';
                </script>
                <!-- include your js files -->
                <script src="/path/to/file.js"></script>






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Dec 30 '18 at 18:06









                xyresxyres

                9,58232345




                9,58232345






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53979824%2fwhy-cant-i-use-jinja-in-javascript-for-a-django-site%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Monofisismo

                    Angular Downloading a file using contenturl with Basic Authentication

                    Olmecas