Arti-Jack
@Arti-Jack

Как отобразить Vue-компоненты, используя данные из БД?

Доброго времени суток

Для начала хотел бы сказать, что я совсем новичок и в джанго, и в vue.

У меня стоит такая задача: у меня реализован бэкенд, нужно написать фронтенд.
В базе данных (в джанго по дефолту стоит SQLite) есть записи, их нужно отобразить. Записи - это сущности-компоненты (Messages). Т.е мне нужно отобразить сообщения из базы данных и отрендерить всё это (используя vue). Причём, отображать надо каждые 10 секунд новые сообщения.

Что реализовано в бэкенде:
Есть база данных из записей, есть модель сообщения (Message), есть сериалайзер, есть вью.

Думаю, целесообразным будет показать код вью и урлов, ведь это ключевой момент.

Views:
from rest_framework import viewsets
from .models import Message
from .serializers import MessageSerializer

from rest_framework.views import APIView
from rest_framework.response import Response


# REST'full 
class MessageViewSet(APIView):
	# queryset = Message.objects.all().order_by('-created_at')
	# serializer_class = MessageSerializer
	def get(sefl, request):
		messages = Message.objects.all()
		serializer = MessageSerializer(messages, many=True)
		return Response(serializer.data)

	def post(sefl):
		pass	



def index(request):
   return render(request, 'webapp/index.html', {})


Урлы:

from django.conf.urls import url, include
# from .views import index
#from .views import MessageViewSet

#urlpatterns = [
 #   url(r'^$', views.index, name='index'),

    # Test api 
  #  url(r'^api/test', views.test_api, name='test_api'),
#]


from rest_framework import routers
from .views import MessageViewSet

# Создаем router и регистрируем наш ViewSet
router = routers.DefaultRouter()
router.register(r'message', MessageViewSet)

# URLs настраиваются автоматически роутером
urlpatterns = [
  url(r'^$', MessageViewSet, name='message'),
  # url(r'^api/test', views.test_api, name='test_api')
]
 
urlpatterns += router.urls


from django.conf.urls import url, include
from django.contrib import admin
from rest_framework.urlpatterns import format_suffix_patterns
from webapp import views

urlpatterns = [
    # url(r'^$', include('webapp.urls')),
    # url(r'^api/v1/', include('webapp.urls')),
    url(r'^admin/', admin.site.urls),
    url(r'^message/', views.MessageViewSet.as_view())
]

urlpatterns = format_suffix_patterns(urlpatterns)


Так же вот код сериалайзера:

from rest_framework import serializers
from .models import Message

class MessageSerializer(serializers.ModelSerializer):
	class Meta:
		model = Message
		fields = ('id', 'text', 'readed')


Когда я в браузере ввожу такой урл: http://127.0.0.1:8000/message/, этот урл обрабатывается и возвращается JSON-представление записей в БД. Например:
[
 {
  "id": 1,
   "text": "First message.",
   "readed": false
 }
]


Мне же необходимо с помощью Vue оторендерить это дело.
Для этого у меня уже есть Vue-компоненты.

Message.vue
<template>
    <div class="message">
        <b-card class="mb-2">
        <p class="card-text">{{data.text}}</p>
        <p>{{data.msg_date}}</p>
            <b-button @click="readed">Прочитано</b-button>
        </b-card>
    </div>
</template>

<script>
    import axios from 'axios'
    export default {
        name: 'message',
        data () {
            return {
                data: {},
            }
        },
        methods: {
            readed: function() {
                console.log('Message readed')
                // ?...
            }
        }
    }
</script>

<style scoped>

</style>


И Messages.vue

<template>
    <div class="messages">
        <message 
          v-for='message in messages'
          v-bind:key="message.id"
        ></message>
    </div>
</template>

<script>
import axios from 'axios'
import Message from './Message'
    export default {
        name: 'messages',
        data () {
            return {
                messages: [1],
                data: {}
            }
        },
        mounted () {
            this.get_messages()
        },
        methods: {
            // FIXME:
            get_messages: function(){
                this.intervalid1 = setInterval(() => {
                    console.log('get')
                    this.messages.push('3')
                    axios.get(????)
                      .then((responce) => {
                      this.data = responce.data
                      })
                      .catch((error) => {
                      console.log(error)
                    })
                }, 10000)
            }
        },
        components: {
            Message
        } 
    }
</script>

<style scoped>
</style>


Правда, я не совсем уверен, верна ли эта практика. Потому вопрос такой: как мне сделать та (исходя из вышеуказанного), чтобы у меня рендерелись Vue-компоненты (которые представляют из себя модель-сообщение), данные которых берутся из БД?
  • Вопрос задан
  • 2772 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Nik_Set_7
Попробуйте разобраться в vuex
У меня идея какая:
- actions для получения данных прописан в vuex
- commit для сохранения данных
- getters для получения данных

из компонента .vue обращаетесь к actions vuex
далее в this.YourObject заносите данные с помощью getters
далее прописываете data() {YourObject: this.YourObject}
всё, по логике Вы получили самые новые данные. А далее выводите в html через v-for
Ответ написан
Комментировать
@JonGalt
В axios вы должны указать полный урл, по которому вы хотите получить данные. В вашем случае это "127.0.0.1:8000/message"
Я так понял, что у вас front и backend на разных серверах. Для того чтобы Vue мог получить данные на backend вам надо использовать библиотеку django-cors-headers для междоменных запросов. Без этого django не даст данные
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы