On Wed, Oct 16, 2013 at 3:39 AM, drakko <[email protected]> wrote:
> ...
>
> But accessing should_have_found_list in template has no problems. I have
> separate JS file that contains functions (event handlers for buttons etc.).
> I can't figure out (total newbie in JS :D ) how to access (or pass)
> should_have_found_list there. (Sorry I wasn't clear enough in my first post)
>
Things that the template context knows are available when the template is
rendered. That is, when the template is turned into (in this case) an HTML
document (represented as a string). This happens on the server.
The only thing sent to the browser is that HTML document, notwithstanding
that that stuff in that HTML document may cause the browser to load other
stuff (like images, javascript files, and CSS files).
But, specifically, the template context is not automatically included in
any way.
If you have a template context variables that you wish to reference from
the javascript (which runs in the browser, long after template rendering is
complete) then you must arrange that the HTML document contain, within a
suitable script tag, javascript code that sets a javascript variable to a
javascript literal. For example, if template context variables "count" and
"name" have, respectively, values 1 and "Joe", you might write something
like this in your template:
<script type="text/javascript">
var ct = {{ count }},
nm = "{{ name }}";
</script>
Which becomes, in the HTML sent to the bowser:
<script type="text/javascript">
var ct = 1,
nm = "Joe";
</script>
Now those values are available to the javascript running in the browser as
"ct" and "nm". (You don't have to use different variable names. I just
wanted it to be clear which were template context variables and which were
javascript variables).
But note that not all python objects can be sent this way. You can't, for
example, just send a queryset and expect to be able to use its "filter"
method from javascript.
You have two choices for sending more complex objects who's ultimate parts
are representable as javascript scalars. If they can be JSON encoded, then
that *IS* a javascript object literal. Or you can iterate through the
object (and subobjects) rendering each by hand, including suitable
javascript object syntax separators and wrappers, like brackets, braces and
commas.
Note, too, that my first code above does not work if the name variable
contains a double quote, since:
nm = "Joe "the schmoe" Gogo";
isn't valid javascript. The json built into modern pythons is willing to
encode a string as a suitable javascript object literal, with all necessary
escaping and with the quotes built in (even though this isn't legal JSON -
formally the top level object must be a javascript array or object). So if
the name template context variable had been created in the view thusly:
...
name = json.dumps(obj.name),
...
then the following is correct:
<script type="text/javascript">
var ct = {{ count }},
nm = {{ name }};
</script>
Note that the quotes have been removed.
[It might be useful to have a json dumps template filter. Perhaps there's
one I haven't found.]
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/CAB%2BAj0tow5e0_e-%2BpYx_cVWPf4VCHSipS-ghcpymoUSy1s87tg%40mail.gmail.com.
For more options, visit https://groups.google.com/groups/opt_out.