In previous tutorial, we learn how to integrate Vue with Django. In this tutorial, we will learn how to pass data from Django into Vue component, and utilize it
Updating Vue component
- 
Vue component can accept data via Props
 - 
Lets update our
DemoComponent.vueto add new props calledpoll 
<template>
  <h1>{{ message }}</h1>
</template>
<script>
export default {
  props: {
    poll: {
      type: Object,
      required: true,
    },
  },
  data() {
    return {
      message: "Welcome to Vue!",
    };
  },
};
</script>
- 
Vue component can accept prop with type Object, Array, Boolean and String
 - 
We want to use dict data from Django, so we will use Object type
 - 
Lets refresh our page, and we should see this error since we havent pass the required
pollprops yet 
Passing dict from Django to Vue
- Lets update our 
views.pyto pass simple dict to our html 
def index(request):
    # declare a Poll dict. In real life, you should use a Model with Serializer
    poll = dict()
    poll["id"] = 1
    poll["title"] = "Software Engineering Poll"
    return render(request, 'polls/index.html', { "poll": poll })
- Since the data already passed into 
polls/index.html, lets update the file so we can pass the data to the Vue component 
{% extends 'polls/base_layout.html' %}
{% block main_content %}
<h1>Hello, world. You're at the polls index.</h1>
<!-- load the Vue component -->
<demo-component :poll="{{ poll }}" ></demo-component>
{% endblock %}
- Lets refresh our page to check whether Vue component already received the required data
 

Utilizing the prop data with Vue
- 
Once the
polldata is available to Vue component via props, we can start using the data inside the Vue component - 
Lets update
DemoComponent.vuehtml to show thepolltitle. Notice that we wrap under div container to prevent Vue error when using multiple HTML element 
<template>
  <div>
    <h1>{{ message }}</h1>
    <h2>{{ poll.id }} - {{ poll.title }}</h2>
  </div>
</template>
<script>
export default {
  props: {
    poll: {
      type: Object,
      required: true,  
    },
  },
  data() {
    return {
      message: "Welcome to Vue!",
    };
  },
};
</script>
- Lets refresh our page to preview the changes
 

- Congratulations! Next we will pass array of data to our Vue component and utilize it
 
Update Vue component to receive array
- Lets edit 
DemoComponent.vueand add new props calledpoll_questions 
<template>
  <div>
    <h1>{{ message }}</h1>
    <h2>{{ poll.id }} - {{ poll.title }}</h2>
  </div>
</template>
<script>
export default {
  props: {
    poll: {
      type: Object,
      required: true,  
    },
    poll_questions: {
      type: Array,
      required: true
    },
  },
  data() {
    return {
      message: "Welcome to Vue!",
    };
  },
};
</script>
Passing array of dict from Django to Vue
- Lets edit 
views.pyagain 
def index(request):
    # declare a Poll dict. In real life, you should use a Model with Serializer
    poll = dict()
    poll["id"] = 1
    poll["title"] = "Software Engineering Poll"
    # declare array of Poll Questions dict. In real life, you should use a Model with Serializer
    poll_questions = []
    poll_question1 = dict()
    poll_question1["id"] = 1
    poll_question1["title"] = "Your favourite Python framework?"
    poll_questions.append(poll_question1)
    poll_question2 = dict()
    poll_question2["id"] = 2
    poll_question2["title"] = "Your favourite Javascript framework?"
    poll_questions.append(poll_question2)
    return render(request, 'polls/index.html', { "poll": poll, "poll_questions": poll_questions })
- Now lets edit 
polls/index.htmlto pass thepoll_questionsdata into Vue component 
{% extends 'polls/base_layout.html' %}
{% block main_content %}
<h1>Hello, world. You're at the polls index.</h1>
<!-- load the Vue component -->
<demo-component :poll="{{ poll }}" :poll_questions="{{ poll_questions }}"></demo-component>
{% endblock %}
- Lets refresh our page to check whether Vue component already received the required data
 

- Lets edit 
DemoComponent.vueto utilize the array of Poll Questions 
<template>
  <div>
    <h1>{{ message }}</h1>
    <h2>{{ poll.id }} - {{ poll.title }}</h2>
    <!--  demo usage of poll_questions -->
    <p>List of questions:</p>
    <p v-for="question in poll_questions" :key="question.id">{{ question.id }} -  {{ question.title }}</p>
  </div>
</template>
<script>
export default {
  props: {
    poll: {
      type: Object,
      required: true,  
    },
    poll_questions: {
      type: Array,
      required: true
    },
  },
  data() {
    return {
      message: "Welcome to Vue!",
    };
  },
};
</script>
- Lets refresh our page to preview the changes
 

Additional Notes
- 
In real life, you should copy the Vue props into different property to prevent it from being overwrite if new props data coming in
 - 
If you are using Serializer, you must convert Serializer data into JSON data before passing into the HTML for Vue to consume
 
def index(request):
    poll = Poll.objects.get(id=1)
    poll_serializer = PollSerializer(
        poll
    )
    poll_json_data = json.dumps(poll_serializer.data)
    return render(request, 'polls/index.html', { "poll": poll_json_data })
Wrapping Up
- 
Congratulations! We have succesfully learned how to pass data from Django to Vue!
 - 
In the next post, we will learn How to implement API with Django and Vue. Stay tuned!