Загрузка данных


1. КОМАНДЫ В ТЕРМИНАЛЕ (выполнять по порядку)----------------------------------------------
python -m django startproject mykoro .
python manage.py startapp main
Потом открыть файл mykoro/settings.py, найти INSTALLED_APPS, добавить в конец: 'main',

Далее:

bash
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser   # Логин: Admin, Пароль: Glebas33
python manage.py runserver


3. ФАЙЛ main/models.py (полностью)---------------------------------------------------------
python
from django.db import models
from django.contrib.auth.models import User

class Course(models.Model):
    name = models.CharField(max_length=200)
    def __str__(self):
        return self.name

class Application(models.Model):
    STATUS_CHOICES = [
        ('Новая', 'Новая'),
        ('Идет обучение', 'Идет обучение'),
        ('Обучение завершено', 'Обучение завершено'),
    ]
    PAYMENT_CHOICES = [
        ('наличные', 'Наличными'),
        ('перевод', 'Перевод по номеру телефона'),
    ]
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    desired_start_date = models.DateField()
    payment_method = models.CharField(max_length=20, choices=PAYMENT_CHOICES)
    status = models.CharField(max_length=50, choices=STATUS_CHOICES, default='Новая')
    created_at = models.DateTimeField(auto_now_add=True)

class Review(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    text = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

4. ФАЙЛ main/admin.py-------------------------------------------------------------------

python
from django.contrib import admin
from .models import Course, Application, Review

admin.site.register(Course)
admin.site.register(Application)
admin.site.register(Review)

5. ФАЙЛ main/views.py------------------------------------------------------------------

python
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.decorators import login_required
from .models import Application, Course

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')
    else:
        form = UserCreationForm()
    return render(request, 'main/register.html', {'form': form})

@login_required
def new_application(request):
    if request.method == 'POST':
        course_id = request.POST.get('course')
        start_date = request.POST.get('start_date')
        payment = request.POST.get('payment')
        course = Course.objects.get(id=course_id)
        Application.objects.create(
            user=request.user,
            course=course,
            desired_start_date=start_date,
            payment_method=payment
        )
        return redirect('my_applications')
    courses = Course.objects.all()
    return render(request, 'main/new_app.html', {'courses': courses})

@login_required
def my_applications(request):
    apps = Application.objects.filter(user=request.user)
    return render(request, 'main/my_apps.html', {'applications': apps})

6. ФАЙЛ mykoro/urls.py------------------------------------------------------------------

python
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('main.urls')),
]

7. ФАЙЛ main/urls.py (создать в папке main)------------------------------------------------------------------

python
from django.urls import path
from . import views
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('register/', views.register, name='register'),
    path('login/', auth_views.LoginView.as_view(template_name='main/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(next_page='/'), name='logout'),
    path('new/', views.new_application, name='new_application'),
    path('my/', views.my_applications, name='my_applications'),
]

8. ШАБЛОНЫ (создать папку main/templates/main/ и внутри 5 файлов)------------------------------------------------------------------

base.html------------------------------------------------------------------

html
<!DOCTYPE html>
<html>
<head><title>Корочки.есть</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
body{font-family:Arial;padding:10px}
.container{max-width:600px;margin:auto}
input,select,button{width:100%;padding:8px;margin:5px 0}
@media (max-width:390px){body{font-size:14px}}
.slider{text-align:center;margin:20px 0}
</style>
</head>
<body>
<div class="container">
<div class="slider">
<img id="slide-img" src="/static/images/1.jpg" width="300"><br>
<button id="prev">❮ Назад</button><button id="next">Вперед ❯</button>
</div>
{% block content %}{% endblock %}
</div>
<script>
const images=['1.jpg','2.jpg','3.jpg','4.jpg'];
let idx=0;
const imgEl=document.getElementById('slide-img');
setInterval(()=>{idx=(idx+1)%images.length; imgEl.src='/static/images/'+images[idx];},3000);
document.getElementById('prev').onclick=()=>{idx=(idx-1+images.length)%images.length; imgEl.src='/static/images/'+images[idx];};
document.getElementById('next').onclick=()=>{idx=(idx+1)%images.length; imgEl.src='/static/images/'+images[idx];};
</script>
</body>
</html>

register.html------------------------------------------------------------------

html
{% extends 'main/base.html' %}
{% block content %}
<h2>Регистрация</h2>
<form method="post">{% csrf_token %}{{ form.as_p }}<button type="submit">Создать пользователя</button></form>
<p><a href="{% url 'login' %}">Уже есть аккаунт? Вход</a></p>
{% endblock %}

login.html------------------------------------------------------------------

html
{% extends 'main/base.html' %}
{% block content %}
<h2>Вход</h2>
<form method="post">{% csrf_token %}{{ form.as_p }}<button type="submit">Войти</button></form>
<p><a href="{% url 'register' %}">Ещё не зарегистрированы? Регистрация</a></p>
{% endblock %}

new_app.html---------------------------------------------------------------------------------------------------

html
{% extends 'main/base.html' %}
{% block content %}
<h2>Новая заявка</h2>
<form method="post">
{% csrf_token %}
<select name="course">
{% for c in courses %}
<option value="{{ c.id }}">{{ c.name }}</option>
{% endfor %}
</select>
<input type="date" name="start_date" required>
<label><input type="radio" name="payment" value="наличные"> Наличные</label>
<label><input type="radio" name="payment" value="перевод"> Перевод</label>
<button type="submit">Отправить</button>
</form>
{% endblock %}

my_apps.html------------------------------------------------------------------

html
{% extends 'main/base.html' %}
{% block content %}
<h2>Мои заявки</h2>
<ul>
{% for app in applications %}
<li>{{ app.course.name }} — {{ app.desired_start_date }} — {{ app.status }}</li>
{% empty %}
<li>Пока нет заявок</li>
{% endfor %}
</ul>
<a href="{% url 'new_application' %}">Новая заявка</a>
{% endblock %}

9. ПОСЛЕДНИЕ ДЕЙСТВИЯ НА ЭКЗАМЕНЕ------------------------------------------------------------------

Скопировать папку static в корень проекта (рядом с manage.py).

Зайти в админку /admin под Admin / KorokNET.

Добавить три курса (названия любые).

Проверить:

/register – создание пользователя

/login – вход

/new – создание заявки

/my – список заявок

Слайдер должен крутиться и реагировать на кнопки.