Загрузка данных
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 – список заявок
Слайдер должен крутиться и реагировать на кнопки.