Разработка сайта горнодобывающей компании «Гранит»
Содержание:
Введение
Интернет стал, наиболее эффективным средством рекламы и продвижения и является одним из важных элементов современной цивилизации. Интернет может удовлетворить все потребности современного человека: это покупки, заключение деловых отношений, поиск клиентов и так далее. Но многие заходят в Интернет читать, развлекаться, общаться, узнавать что-то новое для себя. Поэтому создание сайтов стало таким популярным.
В данной работе будет создан сайт горнодобываютщей компании “Гранит”, на котором посетители смогут видеть возможные варианты вкладов и кредитов, осуществлять переводы сумм другим лицам, а также получать справочную информацию о компании, такую как адреса отделений и контактные телефоны линии поддержки. Для выполнения поставленных работы необходимо:
- разработать страницы сайта на основе HTML кода;
- спроектировать таблицы стилей CSS для применения их на страницах сайта;
- создать базу данных для сайта на основе SQLite3;
- создать код Python (Django framework) для работы с данными.
Техническое задание и выбор средств реализации.
Техническое задание.
Необходимо разработать сайт «Гранит». Сайт должен быть выполнен, соблюдая следующие правила:
1) Общее количество разделов сайта должно быть не менее шести.
2) язык разметки сайта – HTML;
3) безошибочная работа, отображение в браузерах: InternetExplorer, MozillaFirefox, Opera (Chrome, Safari);
4) наличие страницы "Карта сайта";
5) все страницы сайта должны быть наполнены осмысленной информацией;
Задачи сайта Гранит:
- Предоставление информации о компании Гранит
- Контактная информация
- Услуги
Средства реализации.
Выбор средств был прост это коды html, css, python(Django framework). Базой данных служит файлы с данными.
HTML (HyperText Markup Language) — язык разметки (маркировки) гипертекста. Гипертекст своим развитием обязан интернету, хоть и создавался он совсем не для того. HTML дает возможность производить переход от одной части текста к другой, и, что замечательно, эти части могут храниться на совершенно разных компьютерах.
HTML не стоит путать с языками программирования, он создан специально для разметки Web-страниц. Именно язык разметки дает браузеру необходимые инструкции о том, как отображать тексты и другие элементы страницы на мониторе. Важно заметить, что не только различные браузеры, но и различные их версии могут по-разному воспринимать и отображать на экране код.
CSS (Cascading Style Sheets) — язык таблиц стилей, который позволяет прикреплять стиль (например, шрифты и цвет) к структурированным документам (например, документам HTML и приложениям XML). Обычно CSS-стили используются для создания и изменения стиля элементов веб-страниц и пользовательских интерфейсов, написанных на языках HTML и XHTML, но также могут быть применены к любому виду XML-документа, в том числе XML, SVG и XUL. Отделяя стиль представления документов от содержимого документов, CSS упрощает создание веб-страниц и обслуживание сайтов. CSS поддерживает таблицы стилей для конкретных носителей, поэтому авторы могут адаптировать представление своих документов к визуальным браузерам, слуховым устройствам, принтерам, брайлевским устройствам, карманным устройствам и т.д.
Каскадные таблицы стилей описывают правила форматирования элементов с помощью свойств и допустимых значений этих свойств. Для каждого элемента можно использовать ограниченный набор свойств, остальные свойства не будут оказывать на него никакого влияния.
Python — высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.
Python поддерживает структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное программирование. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений, высокоуровневые структуры данных. Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.
Django — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.
Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других (например, Ruby on Rails). Один из основных принципов фреймворка — DRY (англ. Don't repeat yourself)
Также, в отличие от других фреймворков, обработчики URL в Django конфигурируются явно при помощи регулярных выражений.
Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.
.
Описание модулей серверной части программы и их взаимодействие.
В работе с северной частью проведено с использованием python c SQLite. Работа с БД осуществляется при помощи следующими командой который отображает информацию на странице сайта c БД SQLite. Большинство функции в python берет на себя фреймворк Django. В Django встроена аутентификация, авторизация и регистрация пользователя, а также админ панель.
Взаимодействие с БД SQLite:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
Система регистрации в Django осуществляется следующим образом:
def register(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
return redirect('/')
else:
form = RegistrationForm()
return render(request, 'register.html', {'form': form})
После этого нужно создать форму, где нужно указать поля для регистрации в виде:
class RegistrationForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.firstname = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
При помощи Django проводится проверка пользователей. Дальнейший код проводит проверку логинов и паролей.
Пример проверки логинов и паролей:
def signin (request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return render(request, 'signin.html')
После входа идет проверка на права доступа. Панель администратора в Django встроенный. Чтобы активировать панель администратора нужно написать следующий код:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
]
Описание структуры базы данных и ее функций.
База данных в работе является табличной структурой. В базе данных присутствуют таблицы «main», «main_pictures», «main_news»
рис. 1
Рис. 1 Взаимосвязь базы данных с сайтом.
В БД SQLite сохраняются данные пользователей. При регистрации они нужны для в хода в систему пользователей. Каждый новый пользовать добавляется с новой строки. В таб. 1 краткое пояснение.
Таблица 1
Сохранения данных пользователей в базу данных
Наименования |
Расшифровка |
Разрешения символов |
Username |
Логин (имя пользователя) |
Все символы |
Password |
Пароль логина |
Все символы |
|
Электронный почтовый адрес |
Email@mail.com |
First Name |
Имя пользователя |
Все буквы |
Last Name |
Фамилия пользователя |
Все буквы |
В отдельной панели администратора администратор контролирует контент, имеет право изменять данные пользователей, удалять пользователей, в то время как для обычного пользователя все эти возможности недоступны.
Описание структуры клиентской части.
Описание интерфейса «Обычный пользователь».
Для посетителей сайта есть доступ на сайт с осмотром информации рис. 2.
Рис. 2 Главная страница сайта
Для посетителей есть возможность восстановить пароль (рис. 3). Если уже зарегистрированы, то можно войти на сайт (рис. 4). В разделе «Контактная информация» можно узнать контактный телефон, а также расположение нашего офиса (рис. 5).
Рис. 3 Восстановление пароля пользователя.
Рис. 4 Вход пользователей.
Рис. 5 Контактная информация.
Описание интерфейса «Администратор».
Для администратора есть отдельная панель (рис. 6) где администратор может изменить записи на странице (рис. 7), а после сохранить изменения тем самым изменив их на сайте.
Рис. 6 Панель «Администратор»
Рис.7 Форма редактирования «Панель администратора»
Инструкция пользователя.
Для посетителей сайта можно использовать меню для поиска нужной информации:
«Главная» -главная страница информации;
«Вклады и кредиты» -каталог доступных вариантов вкладов и кредитов;
«Акции» -информации о новых и предстоящих акциях;
«Контактная информация» - информация о нашей компании;
«Вход» - вход для пользователей.
«Регистрация» - регистрация новых пользователей.
Заключение
При написании данного курсового проекта были проанализированы существующие языки и редакторы создания сайта, рассмотрены источники по теме работы, разработан сайт по теме «горнодобывающей компании «Гранит»», а также разработано руководство пользователя. Разработанный сайт предоставляет пользователю возможности найти информацию о вкладах, кредитах, акциях. Таким образом, цель работы достигнута, поставленные задачи выполнены.
. Оценивая проделанную работу, можно сделать следующие выводы:
- сайт предоставляет пользователям наиболее нужную ему информацию, а именно возможность ознакомиться с услугами компании
- реализована навигация с помощью меню по страницам сайта;
Для реализации сайта были использованы следующие средства:
- язык разметки гипертекста html и css;
- язык программирования python;
- Django фреймворк;
Список использованной литературы
- Доусон М. Программируем на Python. – СПб.: Питер, 2014. – 416 с.
- Лутц М. Изучаем Python, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 1280 с.
- Лутц М. Программирование на Python, том I, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 992 с.
- Лутц М. Программирование на Python, том II, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 992 с.
- Прохоренок Н.А. Python 3 и PyQt. Разработка приложений. – СПб.: БХВ-Петербург, 2012. – 704 с.
- Вабищевич П. Н. Численные методы. Вычислительный практикум. – – 320 c.
- Пилгрим Марк. Погружение в Python 3 (Dive into Python 3 на русском)
- Прохоренок Н.А. Самое необходимое. — СПб.: БХВ-Петербург, 2011. — 416 с.
- Хахаев И.А. Практикум по алгоритмизации и программированию на Python. – М.: Альт Линукс, 2010. — 126 с. (Библиотека ALT Linux).
- Чаплыгин А.Н. Учимся программировать вместе с питоном.
- Мейер, Б. Инструменты, алгоритмы и структуры данных / Б. Мейер. - 2-е изд., испр. - М. : Национальный Открытый Университет «ИНТУИТ», 2016. Allen Downey – ThinkPython+Kart[Python_3.2]
- https://www.djangoproject.com/
- https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django
- https://developer.mozilla.org/en-US/docs/Web/HTML
- https://html5book.ru/
Base.html:
{% load static %}
<!DOCTYPE html>
<html>
<head>
{% block head %}
{% endblock %}
<meta charset="UTF-8">
<title>Releases</title>
<link rel="stylesheet" href="{% static 'css/base-style.css' %}">
</head>
<body>
<header>
<a href="{% url 'release' %}" class="logo-1"><h1 class="logo">A Локон</h1></a>
{% if user.is_authenticated %}
<ul>
<li><a href="{% url 'release' %}">Вклад</a></li>
<li><a href="{% url 'schedule' %}">О Нас</a></li>
<li><a href="{% url 'news' %}">Новости</a></li>
<li><a href="{% url 'contacts' %}">Контакты</a></li>
<a href="{% url 'profile' %}"><button class="register-but">Профиль</button></a>
<a href="{% url 'logout'%}"><button class="signin-but"> Выйти </button></a>
</ul>
{% else %}
<ul>
<li><a href="{% url 'release' %}">Вклад</a></li>
<li><a href="{% url 'schedule' %}">О Нас</a></li>
<li><a href="{% url 'news' %}">Новости</a></li>
<li><a href="{% url 'contacts' %}">Контакты</a></li>
<a href="{% url 'register' %}"><button class="register-but">Регистрация</button></a>
<a href="{% url 'login' %}"><button class="signin-but"> Войти </button></a>
</ul>
{% endif %}
</header>
<!-- <main> -->
{% block body %}
{% endblock %}
<!-- </main> -->
<footer>
<div class="flex-footer">
<p class="footer-logo">Granit</p>
<div class="links">
<a href="{% url 'about_us' %}" class="footer"><p class="footer-link">О Нас</p></a>
<a href="{% url 'ads' %}" class="footer"><p class="footer-link">Реклама</p></a>
<a href="{% url 'jobs' %}" class="footer"><p class="footer-link">Вакансии</p></a>
<a href="{% url 'contacts' %}" class="footer"><p class="footer-link">Контакты</p></a>
</div>
<div class="social-media">
<p class="footer-link">Следите за новостями компании</p>
<img class="logos" src="{% static 'images/instagram.png' %}" alt="">
<img class="logos" src="{% static 'images/vk.png' %}" alt="">
<img class="logos" src="{% static 'images/twitter.png' %}" alt="">
<img src="{% static 'images/facebook.png' %}" alt="" class="logos">
<p class="author">Создание и разработка сайта — Danila Chernykh</p>
</div>
</div>
</footer>
</body>
</html>
main-page.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-main-page.css' %}">
{% endblock %}
{% block body %}
<main>
<h1 class="granit">Дочерние компании</h1>
<div class="list-granit">
{% for m in granits%}
<div class="flex-granits">
<a href="{% url 'movie' m.granit_name %}"> <img src="{{ m.poster.url }}" alt="" class="first-granit-image"></a>
</div>
{% endfor %}
</div>
<!--<div class="mailing-list">-->
<!--<form action="">-->
<!--<p class="text-mailing-list">Присоединяйтесь к списку рассылки, чтобы оставаться с нами</p>-->
<!--<input class="input-mail" type="text" name="mail">-->
<!--<input class="mailing-button" type="button" value="Отправить"> -->
<!--</form>-->
<!--</div>-->
</main>
{% endblock %}
News.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-news.css' %}">
{% endblock %}
{% block body %}
<main class="news">
<h1 class="news-header">Событие</h1>
{% for n in news %}
<div class="news-1">
<div class="part-1">
<img src="{{ n.image.url }}" alt="" class="news-image-1">
</div>
<div class="part-2">
<h5 class="little-header">Событие</h5><hr class="line-1">
<h2 class="news-info">{{ n.title }}</h2>
<hr class="line-2">
<p class="news-text">{{ n.info }}</p>
<a href="{% url 'news_detail' n.title %}"><button class="button-details">Подробнее</button></a>
</div>
</div>
{% endfor %}
</main>
{% endblock %}
News-detail.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-news_detail.css' %}">
{% endblock %}
{% block body %}
<!--{% if detail %}-->
<main>
<h1 class="title">{{ detail.title }}</h1>
<hr>
<p class="text-detail">{{ detail.main_text }}</p>
</main>
<!--{% endif %}-->
{% endblock %}
Profile.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-profile.css' %}">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
{% endblock %}
{% block body %}
<main>
<div class="container">
<h1>Профиль</h1>
<p>Имя пользователя: {{ user }}</p>
<p>Имя: {{ user.first_name }}</p>
<p>Фамилия: {{ user.last_name }}</p>
<p>Почта: {{ user.email }}</p>
</div>
</main>
{% endblock %}
Register.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-register.css' %}">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
{% endblock %}
{% block body %}
<main>
<form method="POST" class="container">
<h1 class="header-little">Создать Аккаунт</h1>
{% csrf_token %}
{{ form.as_p }}
<input type="submit" class="save-button" value="Сохранить">
</form>
</main>
{% endblock %}
Signin.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-signin.css' %}">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
{% endblock %}
{% block body %}
<main>
<div class="signin">
<h1 class="login-text">Войти</h1>
<form action="" class="container" method="POST">
{% csrf_token %}
{{ form.as_p }}
<input class="btn btn-dark" type="submit" value="Войти">
</form>
</div>
</main>
{% endblock %}
Schedule.html:
% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-schedule.css' %}">
{% endblock %}
{% block body %}
<main class="schedule-main">
<h1 class="schedule">О Нас</h1>
</div>
<hr>
<div class="schedule-movies">
{% for granit in granits%}
<div class="granit-1">
<a href="{% url granit granit.granit_name %}"> <img src="{{ movie.poster.url }}" alt="" class="poster"></a>
<div class="granit-1-1">
<a class="granit-name-link" href="{% url 'granit' granit.granit_name %}"> <h3 class="granit-name">{{ granit.granit_name }}</h3></a>
<p class="genre">{{ granit.age }} {{ movie.genre }} </p>
<ul class="when">
{% for premiere in premieres %}
<li class="quality">{{ premiere.quality }}</li>
<li class="times"><p class="time">{{ premiere.date | date:"D d M Y" }}</p> <p>от {{ premiere.cost }}р.</p></li>
<!--<li class="times"><p class="time">15:30</p> <p>от 350р.</p></li>-->
<!--<li class="times"><p class="time">15:30</p> <p>от 350р.</p></li>-->
{% endfor %}
</ul>
</div>
</div>
{% endfor %}
</div>
</main>
{% endblock %}
granit.html:
{% extends 'base.html' %}
{% load static %}
{% load embed_video_tags %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-movie.css' %}">
{% endblock %}
{% block body %}
<main class="main-movie">
<div class="flex-movie">
<div class="flex-1">
<img src="{{ film.poster.url }}" alt="" class="movie-poster">
<p class="movie-age">{{ film.age }}</p>
<h1>{{ film.movie_name }}</h1>
<p class="movie-info-header">Вакансии</p>
<p class="movie-info">{{ film.date_release | date:"d M Y" }}</p>
<p class="movie-info-header">Вклады</p>
<p class="movie-info">{{ film.genre }}</p>
<p class="movie-info-header">Контакты</p>
<p class="movie-info">{{ film.producer }}</p>
<p class="movie-info-header">Стоимость</p>
<p class="movie-info">{{ film.duration }} мин.</p>
<p class="about-movie">{{ film.about }}</p>
</div>
<div class="flex-2">
<div class="granit-week">
</div>
<h3 class="name-of-granit">Granit</h3>
<p class="address">м. Павелецкая</p>
<ul class="when">
{% for premiere in premieres %}
<li class="quality">{{ premiere.quality }}</li>
<li class="times"><p class="time">{{ premiere.date | date:"D d M Y" }}</p> <p>от {{ premiere.cost }}р.</p></li>
{% endfor %}
</ul>
<a href="{% url 'schedule' %}" class="all-schedule" id="all-sched">ВСЕ О ВКЛАДАХ</a>
<div class="movie-trailer">
<iframe width="760" height="456" src="{{ film.video }}" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<div class="flex-shots">
<p class="screenshots-header">Наши кадры</p>
{% for pic in film.pictures.all %}
<img src="{{ pic.images.url }}" alt="" class="screenshots">
{% endfor %}
</div>
</div>
</div>
</main>
{% endblock %}
About-us.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-about-us.css' %}">
{% endblock %}
{% block body %}
<main>
<h1 class="granit">О нас</h1>
</main>
{% endblock %}
Ads.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-about-us.css' %}">
{% endblock %}
{% block body %}
<main>
<h1 class="granit">Размещение рекламы</h1>
<p>
Мы предлагают широкие рекламные возможности как для традиционной рекламы , так для различных спецпроектов.
Наружная реклама, которая оказывает точечное воздействие на местное сообщество – жителей и часто бывающих в районе расположения. Наружная реклама - наиболее востребованное и эффективное средство рекламы с относительно низким порогом вхождения. Особенно популярны у компаний разноформатные билборды (щиты), городские указатели и транспарант-перетяжки.
Ознакомтесь с нашими услугами перейдя по ссылке.
Перечень основных рекламных возможностей:
- билборды (щиты).
- городские указатели.
- используют продающие сайты, оптимизацию сайтов в поисковых системах, контекстную и баннерную рекламу в Интернет.
- эскалаторные и вестибюльные щиты в метрополитене у выходов.
- Размещение рекламы в лайтбоксах сити-формата в фойе
- Размещение рекламных стоек, ролл-апов в фойе
- реклама на стикерах в вагонах метр.
- Размещение рекламы на столиках в барах, кафе.
По вопросам размещения рекламы и просчета рекламных кампаний, обращайтесь в Коммерческий департамент: (495) 711-50-55 или на admin@granit.com
</p>
</main>
{% endblock %}
Contacts.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-contacts.css' %}">
{% endblock %}
{% block body %}
<main>
<div class="center-elements">
<h1 class="movies">Контакты</h1>
<img src="{% static 'images/map.png' %}" alt="" class="map-image">
</div>
<div class="flex">
<div class="part-1">
<div class="info">
<a href="#"><p class="phone-number">+7 (495) 771-70-70</p></a>
</div>
<div class="info">
<a href="#"><p class="phone-number">+(495) 711-50-55 </p></a>
Отдел маркетинга и PR
</div>
<div class="info">
<a href="#"><p class="phone-number">+7(495) 711-50-55 p></a>
Отдел кадров
</div>
<div class="info">
<a href="#"><p class="phone-number">+ 7 (495) 711-50-55 (103) </p></a>
Поддержка бонусной программы
</div>
<div class="info">
<a href="#"><p class="phone-number">+7 (495) 785-17-03</p></a>
По вопросам электронных переводов
</div>
</div>
<div class="part-2">
<div class="info">
<a href="#"><p class="phone-number"> admin@granit.com
</p></a>
По вопросам о нашей компании
</div>
<div class="info">
<a href="#"><p class="phone-number"> admin@granit.com u
</p></a>
По вопросам сотрудничества
</div>
<div class="info">
<a href="#"><p class="phone-number"> admin@granit.com </p></a>
Департамент по персоналу
</div>
<div class="info">
<a href="#"><p class="phone-number"> admin@granit.com
</p></a>
По вопросам работы сайта и бонусной программы
</div>
<div class="info">
<a href="#"><p class="phone-number"> admin@granit.com
</p></a>
Поддержка <br> телефону: +7(495)785-17-03
</div>
</div>
<div class="text-bottom">
<h1></h1>
<p>125445, г. Москва ул. Правобережная д. 1«Б», <br> ТРЦ «Ленинградский», тел.: +7 (495)771-70-1</p>
</div>
</div>
</main>
{% endblock %}
Jobs.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-about-us.css' %}">
{% endblock %}
{% block body %}
<main>
<h1 class="movies">Вакансии</h1>
<p>Сотрудники компании Гранит - это дружный и сплоченный коллектив и главная его задача — обеспечить посетителям нашего сайта максимум комфорта.
Вам предоставляются ясные перспективы, уверенность в завтрашнем дне, социальная защищенность — мы прилагаем все усилия, чтобы быть идеальным работодателем для своих сотрудников.
Дополнительные преимущества
- Гибкий график работы
- Бесплатное питание
- Работа в стабильной компании
- Перспективы карьерного роста
Вам достаточно заполнить анкету или отправить резюме по адресу:
</p>
</main>
{% endblock %}
Logout.html:
{% extends 'base.html' %}
{% load static %}
{% block head %}
<link rel="stylesheet" href="{% static 'css/style-about-us.css' %}">
{% endblock %}
{% block body %}
<main>
<h1 class="movies">Вы вышли с аккаунта!</h1>
<p>Спасибо за посещение!</p>
</main>
{% endblock %}
Admin.py:
from django.contrib import admin
from .models import granit, Users, granitPremiere, News, granitImages
class granitPremiereAdmin(admin.ModelAdmin):
list_display = ['day', 'time', 'granit','quality', 'cost']
class granitAdmin(admin.ModelAdmin):
list_display = [‘granit_name', 'date_release', 'duration', 'country', 'genre', 'age']
class granitImagesAdmin(admin.ModelAdmin):
list_display = ['title', 'images']
admin.site.register(Movie, GranitAdmin)
admin.site.register(Users)
admin.site.register(GranitPremiere, GranitPremiereAdmin)
admin.site.register(News)
admin.site.register(GranitImages)
cinema/urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('main.urls')),
]
forms.py:
from django.forms import ModelForm, Textarea
from .models import Users
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django import forms
class RegistrationForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.firstname = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
class UsersForm(ModelForm):
class Meta:
model = Users
fields = ('first_name', 'last_name', 'username', 'email', 'password')
# widgets = {
# 'first_name': Textarea(attrs={'font-size':200})
# }
models.py:
from django.db import models
from embed_video.fields import EmbedVideoField
class Users(models.Model):
first_name = models.CharField(max_length=30, blank=False, verbose_name="Имя")
last_name = models.CharField(max_length=50, blank=False, verbose_name="Фамилия")
username = models.CharField(max_length=100, blank=False, verbose_name="Имя Пользователя")
email = models.CharField(max_length=250, blank=False, unique=True, verbose_name="Почта")
password = models.CharField(max_length=100, blank=False, verbose_name="Пароль")
class Meta:
verbose_name = 'Пользователь'
verbose_name_plural = 'Пользователи'
def __str__(self):
return self.username
class MovieImages(models.Model):
images = models.ImageField(upload_to='media/')
class Meta:
verbose_name = 'Кадр'
verbose_name_plural = 'Кадры'
def __str__(self):
return self.images.name
class Movie(models.Model):
movie_name = models.CharField(max_length=250, blank=False, verbose_name="Название вклада")
poster = models.ImageField(upload_to='media/', blank=False, verbose_name=’Тип’)
date_release = models.DateTimeField(auto_now=False, auto_now_add=False, blank=False, verbose_name='Дата')
about = models.TextField(verbose_name='О компании', blank=False)
duration = models.IntegerField(verbose_name='Расчет')
country = models.CharField(max_length=200, blank=False, verbose_name='Партнеры')
genre = models.CharField(max_length=30, choices=genres, default=None, blank=False, verbose_name=’Предложения')
actors = models.TextField(blank=False, verbose_name='Доход')
producer = models.CharField(max_length=250, blank=False, verbose_name='Страхование')
age = models.CharField(max_length=2, choices=ages, default=None, blank=False, verbose_name='Возраст')
video = EmbedVideoField(blank=True, verbose_name=" ")
pictures = models.ManyToManyField(MovieImages)
def __str__(self):
return self.movie_name
class GranitPremiere(models.Model):
days = [
('Понедельник', 'Понедельник'),
('Вторник', 'Вторник'),
('Среда', 'Среда'),
('Четверг', 'Четверг'),
('Пятница', 'Пятница'),
('Суббота', 'Суббота'),
('Воскресенье', 'Воскресенье'),
]
date = models.DateField(blank=False, auto_now_add=False, auto_now=False, verbose_name='Дата премьеры')
day = models.CharField(max_length=20, choices=days, default=None, verbose_name='День недели')
time = models.DateTimeField(auto_now=False, auto_now_add=False, blank=False, verbose_name='Время премьеры')
quality = models.CharField(max_length=5, choices=qualitys, default=qty_2d, verbose_name='Качество')
cost = models.DecimalField(max_digits=4, decimal_places=0, verbose_name='Цена')
movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
class Meta:
verbose_name = 'Премьера'
verbose_name_plural = 'Премьеры'
def __str__(self):
return self.day
class News(models.Model):
title = models.CharField(max_length=250, blank=False)
image = models.ImageField(upload_to='media/', blank=False)
info = models.TextField()
main_text = models.TextField()
class Meta:
verbose_name = 'Новость'
verbose_name_plural = 'Новости'
def __str__(self):
return self.title
urls.py:
from django.urls import path
from . import views
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.conf import settings
from django.contrib.auth import login, logout
from django.contrib.auth.views import LoginView, LogoutView
urlpatterns = [
path('', views.release, name='release'),
path('movie/<str:movie_name>', views.movie, name='movie'),
path('news', views.news, name='news'),
path('schedule', views.schedule, name='schedule'),
path('signin', views.signin, name='signin'),
path('contacts', views.contacts, name='contacts'),
path('about-us', views.about_us, name='about_us'),
path('ads', views.ads, name='ads'),
path('jobs', views.jobs, name='jobs'),
path('news_detail/<str:title>', views.news_detail, name='news_detail'),
path('profile', views.profile, name='profile'),
path('register', views.register, name='register'),
path('login/', LoginView.as_view(template_name='signin.html'), name="login"),
path('logout/', LogoutView.as_view(template_name='logout.html'), name='logout')
# path('login', login, {'template_name': 'signin.html'}),
# path('logout', logout, {'template_name': 'logout.html'}),
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py:
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .forms import UsersForm
from django.contrib.auth.forms import UserCreationForm
from .models import News, Movie, MoviePremiere
from .forms import RegistrationForm
def release(request):
template_name = 'main-page.html'
movies = Movie.objects.all()
args = {
'granit':granit
}
return render(request, template_name, args)
def movie(request, granit_name):
template_name = granit.html'
film = Granit.objects.get(movie_name=movie_name)
premieres = GranitPremiere.objects.all()
args = {'granit':granit, 'premieres':premieres}
return render(request, template_name, args)
def news(request):
template_name = 'news.html'
news = News.objects.all()
args = {
'news': news
}
return render(request, template_name, args)
def contacts(request):
template_name = 'contacts.html'
return render(request, template_name)
def about_us(request):
template_name = 'about-us.html'
return render(request, template_name)
def ads(request):
template_name = 'ads.html'
return render(request, template_name)
def jobs(request):
template_name = 'jobs.html'
return render(request, template_name)
def profile(request):
template_name = 'profile.html'
return render(request,template_name)
def schedule(request):
template_name = 'schedule.html'
schedule_movie = Granit.objects.all()
premiere = GranitPremiere.objects.all()
args = {'granit': schedule_movie, 'premieres': premiere}
return render(request, template_name, args)
def news_detail(request, title):
template_name = 'news-detail.html'
detail = News.objects.get(title=title)
args = {
'detail': detail
}
return render(request, template_name, args)
def signin(request):
return render(request, 'signin.html')
def register(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
return redirect('/')
else:
form = RegistrationForm()
return render(request, 'register.html', {'form': form})
- Правовое регулирование приватизации государственных и муниципальных предприятий (Теоретические аспекты приватизации государственного и муниципального имущества в Российской Федерации)
- Понятие права общей собственности
- Авторское право (Авторское право: понятие, значение, источники)
- Основы изучения корпоративной культуры
- Авторское право (Основные понятия и элементы авторского права)
- Предмет, метод предпринимательского права и принципы предпринимательского права. Понятие предпринимательского права
- Виды и состав угроз информационной безопасности)
- Предмет, метод предпринимательского права и принципы предпринимательского права (Понятие и предмет предпринимательского права)
- Недействительность сделок. Понятие недействительной сделки
- Понятие и правовые признаки общества с ограниченной ответственностью
- Понятие, признаки и правовое регулирование несостоятельности (банкротства). Понятие и признаки несостоятельности (банкротства)
- Нотариальные действия. Понятие и признаки нотариального действия)