Как создать онлайн-систему экзаменов на Django: пошаговое руководство с исходным кодом?

Обзор Django и его преимуществ для веб-разработки

Django – это высокоуровневый Python веб-фреймворк, который поощряет быструю разработку и чистый, прагматичный дизайн. Он берет на себя многие хлопотные моменты веб-разработки, чтобы вы могли сосредоточиться на написании приложения, не изобретая велосипед заново. Django бесплатен и с открытым исходным кодом, имеет процветающее и активное сообщество, обширную документацию и множество готовых решений.

Преимущества Django для веб-разработки:

  • ORM (Object-Relational Mapper): Позволяет взаимодействовать с базами данных, используя Python код, без написания SQL запросов.
  • Шаблонизатор: Предоставляет мощный и гибкий шаблонизатор для создания динамических веб-страниц.
  • Система аутентификации и авторизации: Встроенная система для управления пользователями, их аутентификацией и правами доступа.
  • Административная панель: Автоматически генерируемая административная панель для управления контентом приложения.
  • Безопасность: Защита от распространенных веб-угроз, таких как XSS и CSRF.
  • Масштабируемость: Django легко масштабируется для обработки больших объемов трафика.

Описание проекта: цели и функциональность онлайн-системы экзаменов

Цель проекта – создание веб-приложения для проведения онлайн-экзаменов. Система должна позволять администраторам создавать и управлять экзаменами, вопросами и ответами, а пользователям – проходить экзамены и просматривать свои результаты.

Функциональность системы:

  • Создание и редактирование экзаменов.
  • Добавление, редактирование и удаление вопросов и ответов.
  • Регистрация и аутентификация пользователей.
  • Прохождение экзаменов.
  • Подсчет результатов экзаменов.
  • Просмотр результатов экзаменов пользователями.
  • Административная панель для управления контентом.

Необходимые инструменты и технологии (Python, Django, базы данных)

Для разработки онлайн-системы экзаменов потребуются следующие инструменты и технологии:

  • Python 3.6+.
  • Django 3.0+.
  • База данных: SQLite (для разработки), PostgreSQL, MySQL (для продакшна).
  • Менеджер пакетов pip.
  • Веб-сервер: Gunicorn, Nginx.
  • Система контроля версий: Git.

Настройка Django-проекта и модели базы данных

Создание нового Django-проекта и приложения ‘exams’

Создаем новый Django-проект:

django-admin startproject online_exams
cd online_exams

Создаем приложение ‘exams’:

python manage.py startapp exams

Добавляем ‘exams’ в INSTALLED_APPS в settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'exams', # Добавляем наше приложение
]

Определение моделей данных: Вопросы, Ответы, Экзамены, Результаты

Определяем модели данных в exams/models.py:

from django.db import models
from django.contrib.auth.models import User

class Exam(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self) -> str:
        return self.title

class Question(models.Model):
    exam = models.ForeignKey(Exam, on_delete=models.CASCADE)
    text = models.TextField()

    def __str__(self) -> str:
        return self.text

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    text = models.CharField(max_length=200)
    is_correct = models.BooleanField(default=False)

    def __str__(self) -> str:
        return self.text

class Result(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    exam = models.ForeignKey(Exam, on_delete=models.CASCADE)
    score = models.IntegerField()
    date_taken = models.DateTimeField(auto_now_add=True)

    def __str__(self) -> str:
        return f'{self.user.username} - {self.exam.title} - {self.score}'

Настройка базы данных (SQLite, PostgreSQL) и миграции

Настраиваем базу данных в settings.py. Для разработки можно использовать SQLite:

Реклама
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

Создаем и применяем миграции:

python manage.py makemigrations exams
python manage.py migrate

Создание административной панели для управления контентом экзаменов

Регистрируем модели в exams/admin.py:

from django.contrib import admin
from .models import Exam, Question, Answer, Result

admin.site.register(Exam)
admin.site.register(Question)
admin.site.register(Answer)
admin.site.register(Result)

Создаем суперпользователя для доступа к административной панели:

python manage.py createsuperuser

Теперь можно зайти в административную панель по адресу /admin/ и управлять контентом экзаменов.

Разработка логики экзаменов и пользовательского интерфейса

Создание представлений Django для проведения экзаменов

Создаем представления в exams/views.py:

from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponse
from .models import Exam, Question, Answer, Result
from django.contrib.auth.decorators import login_required

@login_required
def exam_list(request):
    exams = Exam.objects.all()
    return render(request, 'exams/exam_list.html', {'exams': exams})

@login_required
def take_exam(request, exam_id):
    exam = get_object_or_404(Exam, pk=exam_id)
    questions = exam.question_set.all()

    if request.method == 'POST':
        score = 0
        for question in questions:
            try:
                selected_answer_id = request.POST[f'question_{question.id}']
                selected_answer = Answer.objects.get(pk=selected_answer_id)
                if selected_answer.is_correct:
                    score += 1
            except (KeyError, Answer.DoesNotExist):
                # Обработка случая, когда ответ не выбран
                pass

        Result.objects.create(user=request.user, exam=exam, score=score)
        return redirect('exam_result', exam_id=exam_id)

    return render(request, 'exams/take_exam.html', {'exam': exam, 'questions': questions})

@login_required
def exam_result(request, exam_id):
    exam = get_object_or_404(Exam, pk=exam_id)
    result = Result.objects.filter(user=request.user, exam=exam).latest('date_taken')
    return render(request, 'exams/exam_result.html', {'result': result})

Реализация логики обработки ответов и подсчета результатов

Логика обработки ответов и подсчета результатов реализована в функции take_exam.

Разработка шаблонов для интерфейса пользователя (HTML, CSS, JavaScript)

Создаем шаблоны в директории exams/templates/exams/:

  • exam_list.html — список экзаменов.
  • take_exam.html — страница прохождения экзамена.
  • exam_result.html — страница результатов экзамена.

Пример exams/templates/exams/take_exam.html:

<form method="post">
    {% csrf_token %}
    {% for question in questions %}
        <p>{{ question.text }}</p>
        {% for answer in question.answer_set.all %}
            <input type="radio" id="answer_{{ answer.id }}" name="question_{{ question.id }}" value="{{ answer.id }}">
            <label for="answer_{{ answer.id }}">{{ answer.text }}</label><br>
        {% endfor %}
    {% endfor %}
    <button type="submit">Submit</button>
</form>

Добавление функциональности таймера и автоматического завершения экзамена

Для реализации таймера можно использовать JavaScript. Добавляем JavaScript код в шаблон take_exam.html для отсчета времени и автоматической отправки формы после истечения времени.

Реализация аутентификации и авторизации пользователей

Настройка системы аутентификации Django

Django предоставляет встроенную систему аутентификации и авторизации. Настройки находятся в settings.py:

LOGIN_REDIRECT_URL = 'exam_list'  # Перенаправление после успешного входа
LOGOUT_REDIRECT_URL = 'login' # Перенаправление после выхода

Создание представлений для регистрации и входа пользователей

Используем стандартные представления Django для регистрации и входа пользователей или создаем свои кастомные представления.

«`python
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views import generic

class SignUpView(generic.CreateView):
formclass = UserCreationForm
success
url = reverselazy(«login»)
template
name =


Добавить комментарий