Установка nodejs
Чтобы работать с vue, ставим себе node.js сначала. Идем на сайт https://nodejs.org/en
если вы на своем домашнем компе, то тыкаете просто и ставите

если вы работаете в политехе, то надо скачать zip архив

потом его разархивировать в папку пользователя например



и затем прописать в переменных среды пользователя



теперь если запустить консольку и написать node увидим что-то такое:

Создаем vue проект
Идем по адресу https://vuejs.org/guide/quick-start.html
и копируем оттуда команду
и запускаем ее в коносльку нашего проекта

немного ждем, он начнет задавать вопросы отвечаем вот так:

после завершения ответов увидим, что у нас появилась новая папочка client

теперь надо поставить все пакеты необходимые для работы клиента, для этого переходим в папку client и запускаем команду npm install

чтобы запустить сервер запускаем команду npm run dev


теперь удаляем все лишние из файлика App.vue, должно остаться только вот это

удаляем содержимое папки components

очищаем роуты

удаляем counters

удаляем содержимое assets

и удаляем ссылку в main.js

Работа с реактивными переменными
Чтобы вывести значение переменной надо написать:

можно сразу чего-нибудь считать

если хочется связать переменны с полями для ввода, надо объявлять их используя ref, а привязывать к полю для ввода через v-model

можно привязать реакцию на клик, для этого надо использовать атрибут @click

обратите внимание, что для того, чтобы менять значение переменной надо использовать свойство value, и чтобы вытащить значение в переменной, также надо использовать value
вы можете сделать динамическую переменную через конструкцию computed, она будет автоматом пересчитываться при изменении переменных внутри

Работа с массивами
чтобы вывести массив, объявите его обернув в ref, а затем выведите через v-for

если у вас в массиве словарики, вытаскиваете значения через точечку

вы можете начать выводить названия групп, если заведете отдельный словарик с группами

Выводим список с бекенда
чтобы делать запросы к бэкенду поставим библиотечку axios, пишем команду
теперь сделаем себе кнопку загрузки

и загоним в нее код по загрузки данных сервера

чтобы он не ругался на axios добавьте себе вверху
import axios from "axios"
чтобы vue понимал, что запрос надо отправлять на сервер бэкенда, надо настроить прокси, для этого идем файлик vite.config.js и пишем туда:

теперь добавим себе переменную под студентов подключим ее к результату запросов

чтобы вывести студентов можно написать вот так
<div v-for="item in students">
{{ item.fio }}
</div>
чтобы список студентов загружался сразу при старте приложения можно использовать хук onBeforeMount

надо только не забыть вынести код который стягивает студентов в отдельную функцию.
Подключение bootstrap
Чтобы подключить bootstrap выполните команду
и подключите его в main.js

Добавление записи
Прежде чем начать работать с методами изменения/удаления объектов в БД надо сначал поставить себе пакет для работы с cookie
и затем добавить в App.vue себе
<script setup>
import { onBeforeMount } from 'vue';
import axios from 'axios';
import Cookies from 'js-cookie';
onBeforeMount(() => {
axios.defaults.headers.common['X-CSRFToken'] = Cookies.get("csrftoken");
})
// ...
</script>
Чтобы сделать форму добавления. Сделайте себе переменную под новый объект:
const studentToAdd = ref({});
сделайте форму и подключите ее к этой переменной, типа так
<!-- ТУТ ПОДКЛЮЧИЛ обработчик отправки формы -->
<form @submit.prevent.stop="onStudentAdd">
<div class="row">
<div class="col">
<div class="form-floating">
<!-- ТУТ ПОДКЛЮЧИЛ studentToAdd.name -->
<input
type="text"
class="form-control"
v-model="studentToAdd.name"
required
/>
<label for="floatingInput">Фио</label>
</div>
</div>
<div class="col-auto">
<!-- А ТУТ ПОДКЛЮЧИЛ К select -->
<div class="form-floating">
<select class="form-select" v-model="studentToAdd.group" required>
<option :value="g.id" v-for="g in groups">{{ g.name }}</option>
</select>
<label for="floatingInput">Группа</label>
</div>
</div>
<div class="col-auto">
<button class="btn btn-primary">
Добавить
</button>
</div>
</div>
</form>
и сделайте функцию обработки отправки формы
async function onStudentAdd() {
await axios.post("/api/students/", {
...studentToAdd.value,
});
await fetchStudents(); // переподтягиваю
}
не забывайте переподтягивать список после добавления записи
Удаление записи
Для удаления добавьте кнопку удаления к каждой строке студента и пробросьте информацию о нажатой строке в функцию которая вызывается по клику
<div v-for="item in students" class="student-item">
<div>{{ item.name }}</div>
<button class="btn btn-danger" @click="onRemoveClick(item)">
<i class="bi bi-x"></i>
</button>
</div>
обработчик соответственно должен вызывать метод delete через axios
async function onRemoveClick(student) {
await axios.delete(`/api/students/${student.id}/`);
await fetchStudents(); // переподтягиваю
}
не забывайте переподтягивать список после удаления записи
Редактирование записи
Для редактирования также надо сделать переменную в которую вы будете хранить изменённое состояние строки
const studentToEdit = ref({});
добавьте в main.js скрипты bootstrap

добавьте разметку модального окна, в котором будут привязаны поля для редактирования студента
<div class="modal fade" id="editStudentModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">
редактировать
</h1>
<button
type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"
></button>
</div>
<div class="modal-body">
<div class="row">
<div class="col">
<div class="form-floating">
<input
type="text"
class="form-control"
v-model="studentToEdit.name"
/>
<label for="floatingInput">Фио</label>
</div>
</div>
<div class="col-auto">
<div class="form-floating">
<select class="form-select" v-model="studentToEdit.group">
<option :value="g.id" v-for="g in groups">
{{ g.name }}
</option>
</select>
<label for="floatingInput">Группа</label>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button
type="button"
class="btn btn-secondary"
data-bs-dismiss="modal"
>
Close
</button>
<button
data-bs-dismiss="modal"
type="button"
class="btn btn-primary"
@click="onUpdateStudent"
>
Сохранить
</button>
</div>
</div>
</div>
</div>
добавить кнопку редактирования которая будет открывать окно и за одно с помощью функции onStudentEditClick фиксировать в переменную studentToEdit информацию о студенте, на которого кликнули
<div v-for="item in students" class="student-item">
<div>{{ item.name }}</div>
<div>{{ groupsById[item.group]?.name }}</div>
<button
class="btn btn-success"
@click="onStudentEditClick(item)"
data-bs-toggle="modal"
data-bs-target="#editStudentModal"
>
<i class="bi bi-pen-fill"></i>
</button>
<button class="btn btn-danger" @click="onRemoveClick(item)">
<i class="bi bi-x"></i>
</button>
</div>
типа так:
async function onStudentEditClick(student) {
studentToEdit.value = { ...student };
}
ну и напоследок кнопка сохранить в модальном окне должна вызывать еще одну функцию которая собственно отправит запрос на сервера, вот так:
async function onUpdateStudent() {
await axios.put(`/api/students/${studentToEdit.value.id}/`, {
...studentToEdit.value,
});
await fetchStudents();
}
не забывайте переподтягивать список после обновления записи