admin管理员组

文章数量:1323707

I'm having a difficult time passing variables from the python backend to javascript. A lot of my variables look like this in javascript:

if ('{{ user.has_paid_plan}}' == 'True') {
    isPayingUser = true;
} else {
    isPayingUser = false;
}

It's ugly and I'm sure there's a much cleaner way to do this. How should this be done?

I'm having a difficult time passing variables from the python backend to javascript. A lot of my variables look like this in javascript:

if ('{{ user.has_paid_plan}}' == 'True') {
    isPayingUser = true;
} else {
    isPayingUser = false;
}

It's ugly and I'm sure there's a much cleaner way to do this. How should this be done?

Share Improve this question edited Oct 19, 2018 at 6:36 David542 asked Oct 19, 2018 at 6:13 David542David542 111k206 gold badges568 silver badges1k bronze badges 6
  • on start of your js script first put all django variables in js variables. eg - var has_paid_plan = {{ user.has_paid_plan }}. Then use that js variable everywhere in rest of your js. This way you can also use these variables in external js files too. Other option is to use data attribute. You can have a data-has_plan in some div or anything. Then you can get its value using js/jQuery. I go with first option when I wil have only one user on a page, if I am showing a list of users, I will go with data attributes – Vaibhav Vishal Commented Oct 19, 2018 at 6:25
  • @VaibhavVishal if I just do {{ user.has_paid_plan }}, I get an error in javascript, because it is literally passed as True (string, no quotes). – David542 Commented Oct 19, 2018 at 6:27
  • you can json serialize it in views. It will get converted to true, or use quotes and check for "True" or "False" – Vaibhav Vishal Commented Oct 19, 2018 at 6:28
  • @VaibhavVishal no, I also use the django variables as well. This is a template that has both html/django templating as well as javascript. – David542 Commented Oct 19, 2018 at 6:29
  • @David542 Change it to var foo = "{{ foo }}"; then. – Selcuk Commented Oct 19, 2018 at 6:29
 |  Show 1 more ment

4 Answers 4

Reset to default 2

This may be an odd approach, but I suppose one way to solve this would be to pass a json object as a variable, which would contain all other variables. For example:

def user(request):
    user = request.user

    ctx = {
      'isPayingUser': user.is_paying_user()
      'age': user.age
      'username': user.email
    }

    json_ctx = json.dumps(ctx)
    ctx['json_ctx'] = json_ctx

    return render(request, 'template.html', ctx)

In this way you have access to all the django/python variables, and you also have all the variables properly json-encoded as the "json_ctx" object which you can use in your javascript.

Let's keep things simple. You don't have to use any other response type like JSON or anything else. The first thing that you do is pass the value from the backend. Assuming User model has a field as "has_paid_plan" as a BooleanField. If not please convert the same to a BooleanField.

views.py

context = dict()
context['user'] = user_instance
return render(request, 'template.html', context)

template.html

Add this to your script.

<script>
   .... // other code
    {% if user.has_paid_plan %}
        isPayingUser = true;
    {% else %}
        isPayingUser = false;
    {% endif %}
</script>

Try to keep things simple. It's a good practice. Hope this helps.

<input type='hidden' value='{{ user.has_paid_plan}}' id='has_paid_plan' />


if ($('#has_paid_plan').val() == 'True') {
    isPayingUser = true;
} else {
    isPayingUser = false;
}

another solution:

<script>
const isAuthenticated = ${str(user.is_authenticated).lower()}
</script>

本文标签: pythonPassing django variables to javascriptStack Overflow