diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/.gitignore" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/.gitignore" new file mode 100644 index 000000000..536a89c5c --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/.gitignore" @@ -0,0 +1,37 @@ +# Python +*.pyc +*.pyo +__pycache__/ + +# Django +*.log +*.pot +*.pyc +*.pyo +*.sqlite3 + +# Environments +.env +.venv/ + +# Media +/media/ + +# Static files +/staticfiles/ + +# VSCode +.vscode/ + +# MacOS +.DS_Store + +# Windows +Thumbs.db + +# IDEs +.idea/ +*.iml + +# Node +node_modules/ diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/README.md" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/README.md" new file mode 100644 index 000000000..1bafa023a --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/README.md" @@ -0,0 +1,97 @@ +# Отчёт по лабораторным работам 7-8. + +**Тема:** Создание веб-приложения на Django + +**Студент:** Шевченко Кристина Валерьевна + +**Группа:** К3320 + + + +## Цель работы: +Создать веб-приложение на Django с тремя страницами: +1. Главная страница. +2. Страница "О разработке". +3. Страница "Обратная связь". + +Реализовать общие хедер и футер для всех страниц, а также форму обратной связи с обработкой данных. + +--- + +## Выполненные задачи: + +### 1. Создание проекта и приложения +- Создан проект Django с именем [`myproject`](myproject ). +- Создано приложение [`main`](main) для реализации функционала. + +### 2. Настройка базового шаблона +- Создан базовый шаблон `base.html`, содержащий общие элементы: + - Хедер с навигацией (ссылки на главную страницу, страницу "О разработке" и "Обратная связь"). + - Футер с копирайтом, контактной информацией и ссылками на страницы. +- Подключены стили через файл `styles.css`. + +### 3. Реализация страниц +- **Главная страница**: + - Отображает приветственное сообщение и список достопримечательностей Байкала. + - Использует шаблон `index.html`. +- **Страница "О разработке"**: + - Содержит информацию о проекте, разработчике, используемых технологиях и полезные ссылки. + - Использует шаблон `about.html`. +- **Страница "Обратная связь"**: + - Содержит форму обратной связи с полями: + - Имя. + - Email. + - Сообщение. + - Реализована обработка данных формы и вывод сообщений об успешной отправке или ошибках. + +### 4. Реализация формы обратной связи +- Создана форма `ContactForm` в файле `forms.py` с использованием Django Forms. +- Поля формы: + - `name` — имя пользователя. + - `email` — email пользователя. + - `message` — сообщение. +- Реализована обработка данных формы в представлении `contacts`: + - При успешной отправке выводится сообщение об успешной отправке. + - При ошибках отображаются соответствующие сообщения. + + +### 6. Работа с моделью +- Создана модель `Place` для хранения информации о достопримечательностях Байкала: + - Название. + - Описание. + - Изображение. +- Данные о достопримечательностях отображаются на главной странице. + + + + +--- + +## Используемые технологии: +- **Python 3.10**. +- **Django 5.2**. +- **HTML5 и CSS3**. +- **SQLite** для хранения данных. + +--- + +## Результат: +В результате выполнения лабораторной работы создано веб-приложение с тремя страницами: +1. **Главная страница**: + - Отображает список достопримечательностей Байкала. +2. **Страница "О разработке"**: + - Содержит информацию о проекте, разработчике и используемых технологиях. +3. **Страница "Обратная связь"**: + - Содержит форму обратной связи с обработкой данных. + +Приложение имеет общий хедер и футер, современный дизайн и удобный интерфейс. + +--- + +## Вывод: +В ходе лабораторной работы были изучены и применены основные возможности Django: +- Работа с шаблонами. +- Создание форм и обработка данных. +- Использование моделей для хранения данных. + +Проект успешно выполнен и соответствует требованиям задания. diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/__init__.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/__init__.py" new file mode 100644 index 000000000..e69de29bb diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/admin.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/admin.py" new file mode 100644 index 000000000..d7bb5afb1 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/admin.py" @@ -0,0 +1,7 @@ + +from django.contrib import admin +from .models import Place + +@admin.register(Place) +class PlaceAdmin(admin.ModelAdmin): + list_display = ('name',) \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/apps.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/apps.py" new file mode 100644 index 000000000..167f04426 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/apps.py" @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class MainConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'main' diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/forms.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/forms.py" new file mode 100644 index 000000000..d2ddeb32b --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/forms.py" @@ -0,0 +1,6 @@ +from django import forms + +class ContactForm(forms.Form): + name = forms.CharField(min_length=2, max_length=100, label='Имя', widget=forms.TextInput(attrs={'placeholder': 'Ваше имя', 'class': 'form-control valid'})) + email = forms.EmailField(label='Email', widget=forms.EmailInput(attrs={'placeholder': 'Ваш email', 'class': 'form-control valid'})) + message = forms.CharField(label='Сообщение', widget=forms.Textarea(attrs={'placeholder': 'Ваше сообщение', 'class': 'form-control valid'})) \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/migrations/0001_initial.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/migrations/0001_initial.py" new file mode 100644 index 000000000..7d1d50866 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/migrations/0001_initial.py" @@ -0,0 +1,23 @@ +# Generated by Django 5.2.1 on 2025-05-11 11:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Place', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200, verbose_name='Название')), + ('description', models.TextField(verbose_name='Описание')), + ('image', models.ImageField(blank=True, null=True, upload_to='places/', verbose_name='Изображение')), + ], + ), + ] diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/migrations/__init__.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/migrations/__init__.py" new file mode 100644 index 000000000..e69de29bb diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/models.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/models.py" new file mode 100644 index 000000000..49d7f3efe --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/models.py" @@ -0,0 +1,10 @@ +from django.db import models + + +class Place(models.Model): + name = models.CharField(max_length=200, verbose_name="Название") + description = models.TextField(verbose_name="Описание") + image = models.ImageField(upload_to='places/', verbose_name="Изображение", blank=True, null=True) + + def __str__(self): + return self.name diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/static/styles.css" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/static/styles.css" new file mode 100644 index 000000000..181fc38af --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/static/styles.css" @@ -0,0 +1,259 @@ +/* Общие стили */ +body { + font-family: 'Roboto', sans-serif; + margin: 0; + padding: 0; + background-color: #f4f4f9; + color: #333; +} + +header { + background-color: #0077b6; + color: white; + padding: 20px; + text-align: center; +} + + + +header nav a { + color: white; + text-decoration: none; + margin: 0 15px; + font-weight: bold; +} + +header nav a:hover { + text-decoration: underline; +} + +main { + padding: 20px; +} + +/* Стили для списка достопримечательностей */ +ul { + list-style-type: none; + padding: 0; +} + +li { + background-color: white; + margin-bottom: 20px; + padding: 15px; + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + display: flex; + align-items: center; + gap: 20px; +} + +li img { + border-radius: 8px; + max-width: 150px; + height: auto; +} + +li h4 { + margin: 0; + font-size: 1.5em; + color: #0077b6; +} + +li p { + margin: 10px 0; + color: #555; +} + +li a { + color: #0077b6; + text-decoration: none; + font-weight: bold; +} + +li a:hover { + text-decoration: underline; +} +footer { + background-color: #0077b6; + color: white; + text-align: center; + padding: 20px 0; + margin-top: 20px; +} + +footer .footer-content { + max-width: 800px; + margin: 0 auto; +} + +footer nav a { + color: white; + text-decoration: none; + margin: 0 10px; +} + +footer nav a:hover { + text-decoration: underline; +} + +footer p { + margin: 5px 0; +} + +footer a { + color: #ffdd00; + text-decoration: none; +} + +footer a:hover { + text-decoration: underline; +} + + + + +ul { + list-style-type: disc; + margin-left: 20px; +} + +ul li { + margin-bottom: 5px; +} + +a { + color: #0077b6; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} +/* Контейнер страницы */ +.contact-container { + max-width: 600px; + margin: 0 auto; + padding: 20px; + background-color: #ffffff; + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +/* Заголовок */ +.contact-title { + text-align: center; + color: #0077b6; + margin-bottom: 10px; + font-size: 2em; +} + +/* Описание */ +.contact-description { + text-align: center; + color: #555; + margin-bottom: 20px; +} + +/* Форма */ +.contact-form .form-group { + margin-bottom: 15px; +} + +.contact-form label { + display: block; + margin-bottom: 5px; + font-weight: bold; + color: #333; +} + +.contact-form input, +.contact-form textarea { + width: 100%; + padding: 10px; + border: 1px solid #ccc; + border-radius: 5px; + font-size: 1em; + box-sizing: border-box; +} + +.contact-form textarea { + resize: vertical; + height: 100px; +} + +/* Кнопка отправки */ +.button-submit { + display: block; + width: 100%; + padding: 10px; + background-color: #0077b6; + color: white; + border: none; + border-radius: 5px; + font-size: 1em; + cursor: pointer; + text-align: center; +} + +.button-submit:hover { + background-color: #005f8a; +} + +/* Сообщения об ошибках */ +.error-message { + color: red; + font-size: 0.9em; + margin-top: 5px; +} + +/* Сообщение об успешной отправке */ +.alert-success { + background-color: #d4edda; + color: #155724; + padding: 10px; + border-radius: 5px; + margin-bottom: 15px; + text-align: center; +} + + +/* Общий стиль для всего сайта */ + + +/* Заголовки */ + h2, h3, h4 { + font-weight: 500; + color: #0077b6; +} + +/* Навигация */ +nav a { + font-weight: 500; + text-decoration: none; + color: white; +} + +nav a:hover { + text-decoration: underline; +} + +/* Кнопки */ +.button-submit { + font-weight: 700; + font-family: 'Roboto', sans-serif; +} +header h1 { + font-size: 2.5em; + color: white; + margin: 0; + text-align: center; +} + +/* Стили для плейсхолдеров */ +input::placeholder, +textarea::placeholder { + font-family: 'Roboto', sans-serif; /* Убедитесь, что шрифт совпадает с основным */ + font-size: 1em; + color: #aaa; /* Цвет плейсхолдера */ +} \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/about.html" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/about.html" new file mode 100644 index 000000000..43d261f0e --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/about.html" @@ -0,0 +1,24 @@ +{% extends 'base.html' %} + +{% block title %}О разработке{% endblock %} + +{% block content %} +

О проекте

+

Этот сайт посвящен Байкалу — самому глубокому озеру в мире. Здесь вы найдете информацию о его достопримечательностях, истории и природных особенностях.

+

О разработчике

+

Этот сайт был разработан студенткой Шевченко Кристиной группы К3320 в рамках учебного проекта по веб-разработке. Основная цель проекта — изучение Django и создание интерактивного веб-приложения.

+

Используемые технологии

+ + +

Полезные ссылки

+ +{% endblock %} \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/base.html" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/base.html" new file mode 100644 index 000000000..1a029fbe8 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/base.html" @@ -0,0 +1,40 @@ + +{% load static %} + + + + + + {% block title %}Озеро Байкал{% endblock %} + + + +
+

Озеро Байкал

+ +
+ + +
+ {% block content %} + {% endblock %} +
+ + + + + \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/contacts.html" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/contacts.html" new file mode 100644 index 000000000..d629f72ee --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/contacts.html" @@ -0,0 +1,43 @@ +{% extends 'base.html' %} + +{% block title %}Обратная связь{% endblock %} + +{% block content %} +
+

Свяжитесь с нами

+

Если у вас есть вопросы или предложения, заполните форму ниже, и мы свяжемся с вами в ближайшее время.

+
+ {% csrf_token %} + {% if success %} +
+ Спасибо за сообщение! Мы свяжемся с вами в ближайшее время. +
+ {% else %} +
+ + {{ form.name }} + {% if form.name.errors %} +
{{ form.name.errors }}
+ {% endif %} +
+
+ + {{ form.email }} + {% if form.email.errors %} +
{{ form.email.errors }}
+ {% endif %} +
+
+ + {{ form.message }} + {% if form.message.errors %} +
{{ form.message.errors }}
+ {% endif %} +
+
+ +
+ {% endif %} +
+
+{% endblock %} \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/index.html" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/index.html" new file mode 100644 index 000000000..2abb8b063 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/index.html" @@ -0,0 +1,23 @@ +{% extends 'base.html' %} + +{% block title %}Главная{% endblock %} + +{% block content %} +

Добро пожаловать на сайт о Байкале!

+

Узнайте больше о самом глубоком озере в мире и его достопримечательностях.

+ +

Достопримечательности

+ +{% endblock %} \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/message.html" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/message.html" new file mode 100644 index 000000000..0f4c27a69 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/templates/message.html" @@ -0,0 +1,6 @@ +Здравствуйте! + +Новое сообщения с сайта. +Имя: {{ name }} +E-mail: {{ email }} +Сообщение: {{ message }} \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/tests.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/tests.py" new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/tests.py" @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/views.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/views.py" new file mode 100644 index 000000000..b6577cee5 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/main/views.py" @@ -0,0 +1,57 @@ +from django.shortcuts import render + +from .forms import ContactForm + +from .models import Place +from django.template.loader import get_template +from django.core.mail import EmailMultiAlternatives + +def index(request): + places = Place.objects.all()[:5] # Отображаем только 5 первых достопримечательностей + return render(request, 'index.html', {'places': places}) + +def about(request): + return render(request, 'about.html') # Страница "О разработке" + + + + + + +def contacts(request): + context ={} + if request.method == 'POST': + form = ContactForm(request.POST) + if form.is_valid(): + # Здесь можно обработать данные формы, например, отправить email + send_message(form.cleaned_data['name'], + form.cleaned_data['email'], + form.cleaned_data['message']) + context = {'success': 1} + else: + form = ContactForm() + + context['form'] = form + + return render( + request, + 'contacts.html', + context=context) + +def send_message(name, email, message): + text= get_template('message.html') + html = get_template('message.html') + context = { + 'name': name, + 'email': email, + 'message': message + } + + subject = 'Сообщение с сайта' + from_email = 'from@example.com' + text_content = text.render(context) + html_content = html.render(context) + + msg = EmailMultiAlternatives(subject, text_content, from_email, ['manager@example.com']) + msg.attach_alternative(html_content, "text/html") + msg.send() \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/manage.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/manage.py" new file mode 100644 index 000000000..92bb9a3b2 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/manage.py" @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/__init__.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/__init__.py" new file mode 100644 index 000000000..e69de29bb diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/asgi.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/asgi.py" new file mode 100644 index 000000000..18346a369 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/asgi.py" @@ -0,0 +1,16 @@ +""" +ASGI config for myproject project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') + +application = get_asgi_application() diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/settings.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/settings.py" new file mode 100644 index 000000000..1d0969380 --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/settings.py" @@ -0,0 +1,131 @@ +""" +Django settings for myproject project. + +Generated by 'django-admin startproject' using Django 5.2.1. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-&7ge)6!#@+ewvt@fnvs*$u3r=$!9^-b*og*3_c&o1_09-oh%%p' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'main', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + +] + +ROOT_URLCONF = 'myproject.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'myproject.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/5.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/5.2/topics/i18n/ + +LANGUAGE_CODE = 'ru-ru' + +TIME_ZONE = 'Europe/Moscow' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.2/howto/static-files/ + +STATIC_URL = 'static/' +STATICFILES_DIRS = [BASE_DIR / 'main/static'] + +# Default primary key field type +# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +import os + +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') + +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' \ No newline at end of file diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/urls.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/urls.py" new file mode 100644 index 000000000..63171531c --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/urls.py" @@ -0,0 +1,31 @@ +""" +URL configuration for myproject project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path +from main import views +from django.conf import settings +from django.conf.urls.static import static +urlpatterns = [ + path('admin/', admin.site.urls), + path('', views.index, name='index'), + path('about/', views.about, name='about'), + path('contacts/', views.contacts, name='contacts') +] + +urlpatterns += static(settings.STATIC_URL, document_root = settings.STATIC_ROOT) +urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT) + diff --git "a/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/wsgi.py" "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/wsgi.py" new file mode 100644 index 000000000..7c6fdd6bb --- /dev/null +++ "b/work/\320\2323320/\320\250\320\265\320\262\321\207\320\265\320\275\320\272\320\276 \320\232\321\200\320\270\321\201\321\202\320\270\320\275\320\260 \320\222\320\260\320\273\320\265\321\200\321\214\320\265\320\262\320\275\320\260/lab_7_8/myproject/wsgi.py" @@ -0,0 +1,16 @@ +""" +WSGI config for myproject project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') + +application = get_wsgi_application() diff --git "a/work/\320\275\320\276\320\274\320\265\321\200_\320\263\321\200\321\203\320\277\320\277\321\213/\320\244\320\230\320\236/\320\275\320\276\320\274\320\265\321\200_\320\273\320\260\320\261\321\213/index.html" "b/work/\320\275\320\276\320\274\320\265\321\200_\320\263\321\200\321\203\320\277\320\277\321\213/\320\244\320\230\320\236/\320\275\320\276\320\274\320\265\321\200_\320\273\320\260\320\261\321\213/index.html" deleted file mode 100644 index d01f779ff..000000000 --- "a/work/\320\275\320\276\320\274\320\265\321\200_\320\263\321\200\321\203\320\277\320\277\321\213/\320\244\320\230\320\236/\320\275\320\276\320\274\320\265\321\200_\320\273\320\260\320\261\321\213/index.html" +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Document - - - - - \ No newline at end of file