Skip to content

Навигационное меню (Navbar)

Навигационное меню или navbar в данном проекте различается для двух типов пользователей: студента и преподавателя. Меню предоставляет доступ к различным функциям системы в зависимости от роли пользователя.

HTML-код для Navbar

HTML-код для навигационной панели находится в navbar.html и использует шаблонные теги Django для отображения ссылок, в зависимости от того, какой пользователь авторизован.

<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <div class="container-fluid">
        <a class="navbar-brand" href="{% url 'dashboard' %}">Система домашних заданий</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>

        <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav ml-auto">
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'dashboard' %}">Панель управления</a>
                </li>
                {% if user.is_authenticated %}
                    {% if user.role == 'teacher' %}
                        <li class="nav-item">
                            <a class="nav-link" href="{% url 'admin_grade_table' %}">Оценки всех студентов</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link" href="{% url 'submission_list' %}">Управление заданиями</a>
                        </li>
                    {% endif %}
                    <li class="nav-item">
                        <form method="post" action="{% url 'logout' %}" style="display:inline;">
                            {% csrf_token %}
                            <button type="submit" class="btn btn-link nav-link" style="display:inline; cursor:pointer;">Выйти</button>
                        </form>
                    </li>
                {% else %}
                    <li class="nav-item">
                        <a class="nav-link" href="{% url 'login' %}">Войти</a>
                    </li>
                {% endif %}
            </ul>
        </div>
    </div>
</nav>

Ссылки в навигационном меню

Меню отображает разные ссылки, в зависимости от роли пользователя:

  • Ссылка на панель управления: {% url 'dashboard' %} — доступна всем авторизованным пользователям и направляет на общую панель, которая отображает нужные функции в зависимости от роли.
  • Ссылка на оценки всех студентов: {% url 'admin_grade_table' %} — доступна только преподавателям и отображает список всех оценок студентов. Студенты не видят эту ссылку в меню.
  • Ссылка на управление заданиями: {% url 'submission_list' %} — также доступна только преподавателям для проверки выполненных студентами заданий и выставления оценок.
  • Форма выхода: реализована через <form> для отправки POST-запроса на URL {% url 'logout' %}, который завершает сессию пользователя и перенаправляет на страницу входа.

Логика авторизации

Навигационное меню проверяет, авторизован ли пользователь через условие user.is_authenticated. Если пользователь не авторизован, в меню отображается ссылка для входа {% url 'login' %}.

Взаимодействие с представлениями

Роли пользователей обрабатываются во вьюшке UserDashboardView и других представлениях, которые фильтруют информацию в зависимости от роли:

class UserDashboardView(LoginRequiredMixin, ListView):
    template_name = 'dashboard.html'
    context_object_name = 'submissions'

    def get_queryset(self): 
        user = self.request.user
        if user.role == 'student':
            return Submission.objects.filter(student=user).select_related('homework')
        return Submission.objects.filter(homework__subject__teachers=user).select_related('homework', 'student')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        user = self.request.user
        context['is_student'] = user.role == 'student'
        return context

Методы get_queryset() и get_context_data() фильтруют данные по роли, возвращая список заданий для студента или списка всех выполненных работ для преподавателя.

В этом шаблоне отображается меню с ролями и фильтрацией, а также форма для выхода. Таким образом, пользователи видят только те элементы, которые им доступны в зависимости от их роли.