Обоснование выбора среды разработки 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Обоснование выбора среды разработки



Проектирование

 

Проектирование интерфейса

 

Интерфейс – общая граница между двумя функциональными объектами, требования к которой определяются стандартом; совокупность средств, методов и правил взаимодействия (управления, контроля и т.д.) между элементами системы.

Так как интерфейс – это очень обширное понятие, которое включает в себя множество факторов, рассмотрим самые важные отличительные черты интерфейса:

- ­интерфейс любого программного обеспечения должен быть легко различаем и интуитивно понятен;

- интерфейс должен обеспечивать удобство его использования, и не вызывать дискомфорт;

- интерфейс не должен мешать работе пользователя и способствовать излишней усталости. [3]

В данном курсовом проекте было принято использовать светлую тему оформления с использованием серого декорационного цвета, так как данные цвета не мешают восприятию контента.

Данное приложение будет иметь 4 формы и будет содержать следующие элементы:

1) Movie_List – главная форма, которая содержит список фильмов и фильтрацию по: категории, жанрам и годам.

2) Movie_Detail – форма о фильме, на который находится полная информация о выбранном фильме а так же отзывы к фильму.

3) Actor – форма о выбранном актере, на который находится полная информация о актере.

4) Director – форма о выбранном режиссере, на который находится полная информация о режиссере

 

Инфологическая модель предметной области

 

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

Проанализируем объекты реального мира. Для формирования концептуальной модели необходимо провести идентификацию объектов сущности базы данных.

Необходимо спроектировать базу данных поиска, информация из которой будет использоваться для ведения учета фильмов.

 Для контроля за новинками кино в БД необходимо хранить список всех имеющихся фильмов, их описание.

При проектировании БД необходимо учитывать следующее:

• новый фильм невозможно добавить, если нет подходящих категорий, жанров, актеров и режиссеров;

Таким образом база данных содержит следующие сущности как Фильм, Категории, Жанры, Актеры и Режиссеры.

Связь между сущностями Фильм и Категории, связывает фильм с его категорией. Данная связь позволяет связывать с одной категорией более одного фильма, причем каждый фильм должен быть обязательно связан с категорией. Также данная связь показывает, что каждый фильм может принадлежать только одной категории.

Сущность Фильм имеет связь с такими сущностями как Жанр, Актер и Режиссер.

Связь между сущностями Фильм и жанр, связывает Фильм и несколько жанров. Данная связь предназначена для организации жанров фильма.

Связь между сущностями Фильм и Актер, связывает Актера и фильмы, в которых он принимал участия. Данная связь предназначена для сохранения данных о актере.

Связь между сущностями Фильм и Режиссер, связывает Режиссера и фильмы, в которых он принимал участия. Данная связь предназначена для сохранения данных о режиссере.

 

Логическая модель данных

В данном курсовом проекте используется девять таблиц базы данных.

Информация о фильмах будет храниться в таблице 3.1.

 

Таблица 3.1 – Информация о фильмах

Название Тип Описание
1 2 3
Id Числовой Первичный ключ. Cодержит описание фильмов.
Title Строковый Cодержит описание фильмов.
Tagline Строковый Cодержит описание фильмов
Desc Строковый Cодержит описание фильмов.
Poster Фото Cодержит описание фильмов.
Year Числовой Cодержит описание фильмов.
Country Строковый Cодержит описание фильмов.
Directors Строковый Cодержит описание фильмов.
Actors Строковый Cодержит описание фильмов.
Genre Строковый Cодержит описание фильмов.
World_premier Дата Cодержит описание фильмов.
Budget Числовой Cодержит описание фильмов
Fees_in_usa Числовой Cодержит описание фильмов
Fees_in_world Числовой Cодержит описание фильмов
Category Строковый Cодержит описание фильмов
Url Строковый Cодержит описание фильмов
Draft Булевый Cодержит описание фильмов

 

Информация о звездах рейтинга будет храниться в таблице 3.2.

 

Таблица 3.2 – Информация о звездах рейтинга

Название Тип Описание
1 2 3
Id Числовой Первичный ключ.Cодержит описание о звездах рейтинга.
Value Числовой Cодержит описание о звездах рейтинга.

 

Информация о категориях будет храниться в таблице 3.3.

 

Таблица 3.3­ ­– Информация о категориях

Название Тип Описание
1 2 3
Id Числовой Первичный ключ. Содержит информацию о категории.
name Строковый Содержит информацию о категории.
description Строковый Содержит описание категории.
URL Строковый Содержит информацию о категории.

 

Информация о учащихся будет храниться в таблице 3.4.

 

Таблица 3.4­ ­– Информация о актерах

Название Тип Описание
1 2 3
id Числовой Первичный ключ. Содержит информацию о актере.
name Строковый Содержит информацию о актере.
desc Строковый Содержит описание актера.
image Фото Содержит фото актера.
age Числовой Содержит информацию о актере.

 

Информация о режиссерах будет храниться в таблице 3.5.

 

Таблица 3.5 – Информация о режиссерах

Название Тип Описание
1 2 3
Id Числовой Первичный ключ. Содержит информацию о режиссерах.
name Строковый Содержит информацию о режиссерах.
age Числовой Содержит информацию о режиссерах.
desc Строковый Содержит описание режиссерах.
image Фото Содержит описание пользователях.

 

Информация о жанрах будет хранится в таблице 3.6.

 

Таблица 3.6 – информацию о жанрах

Название Тип Описание
1 2 3
Id Числовой Первичный ключ. Содержит информацию о жанрах
name Строковый Содержит информацию о жанрах.
desc Строковый Содержит информацию о жанрах.
url Строковый Содержит ссылку на жанр.

 

Информация о кадрах из фильмов будет храниться в таблице 3.7.

 

Таблица 3.7 – Информация о кадрах из фильмов

Название Тип Описание
1 2 3
Id Числовой Первичный ключ. Cодержит информацию о кадрах из фильмов.
Title Строковый Cодержит информацию о кадрах из фильмов.
Desc Строковый Cодержит информацию о кадрах из фильмов.
Image Изображение Cодержит описание о кадрах из фильмов.
Move Числовой Cодержит описание о кадрах из фильмов.

 

Информация о рейтинге будет храниться в таблице 3.8.

 

Таблица 3.8 – Информация о рейтинге

Название Тип Описание
1 2 3
Id Числовой Первичный ключ. Cодержит информацию о рейтинге.
Ip Числовой Cодержит информацию о рейтинге.
Star Числовой Cодержит информацию о количестве звезд.
Move Строковый Cодержит информацию о фильме.

Информация о отзывах будет храниться в таблице 3.9.

 

Таблица 3.9 – Информация о отзывах

Название Тип Описание
1 2 3
Id Числовой Первичный ключ. Cодержит информацию о рейтинге.
Email Строковый Cодержит информацию о рейтинге.
Name Строковый Cодержит информацию о имени пользователя.
Text Строковый Cодержит информацию о фильме.
Parent Строковый Cодержит информацию о фильме.
Movie Строковый Содержит информацию о фильме.

 

Описание программы

 

Физическая структура

 

Данный курсовой проект имеет следующую физическую структуру, что изображено на рисунке 4.1.

 

Рисунок 4.1 – Физическая структура проекта

 

Папка movies включает в себя следующие формы:

1) admin – отвечает за панель администратора.

2) apps – отвечает за основные настройки.

3) forms – отображение и добавление рейтинга и отзыва к фильму

4) models – создание базы данных

5) urls – создание url путей

6) views – содержит представление жанров, вывод полного описания фильма, вывод всех фильмов, вывод отзыва и рейтинга, вывод актеров и режиссеров, фильтрацию фильмов, поиск.

 

Логическая структура

 

Классы Category, Actor, Director, Genre, Movie, MovieShots, RatingStar, Rating, Reviews содержат метод __str__(self), для вывода данных.

Класс Actor, Director, Movie содержат метод get_absolut_url(), для корректного отображения ссылки.

Класс Movie содержит метод get_review(), для добавления и вывода отзывов

Особенности интерфейса

При открытии приложения пользователю отображается главная форма. На данной форме расположены последние добавленные фильмы, фильтрация, поиск, изображённые на рисунке 4.2.

 

Рисунок 4.2 – Главная форма

При выборе фильтров, пользователю выводится результат фильтрации, изображено на рисунке 4.3.

 

Рисунок 4.3 – Результат фильтрации

 

При нажатии на кнопку «Поиск», если поле поиска заполнено – пользователю выводятся фильмы с похожим названием, изображено на рисунке 4.4.

Рисунок 4.4 – Фильмы с похожим названием

 

При нажатии на пункт «Отправить», пользователь отправляет свой отзыв к фильму, изображено на рисунке 4.5.

 

Рисунок 4.5 – Отправка отзыва

Условия применения

Минимальные системные требования – это набор условий, необходимых для возможности запуска и работы программного продукта. Однако, наличие минимальных системных требований не отменяет возможность запуска ПО на компьютерах, которые по характеристикам слабее минимальных.

Минимальные системные требования для запуска приложения:

1) Операционная система: Windows 7 и выше.

2) Процессор: Pentium 4 1 ГГц или более быстрый процессор.

3) Оперативная память: 515 МБ или больше.

4) Свободного места жестком диске: более 1 ГБ.

5) Видеоадаптер: поддерживающая архитектуру DirectX 10 и выше.

6) Видеопамять: 128 МБ или больше.

Рекомендуемые системные требования для запуска приложения:

1) Операционная система: Windows 10.

2) Процессор: A6 7310 2.4 ГГЦ.

3) Оперативная память: 8 ГБ.

4) Свободного места жестком диске: более 4 ГБ.

 

Назначение программы

 

Данное приложение предназначено для введения учета информации о новинках в киноиндустрии. Оно легка в использовании, так как интерфейс был разработан так, чтобы было интуитивно понятно, в целях того, чтобы пользователю не приходилось искать нужные ему функции.

Что бы просмотреть информацию о фильмах, пользователь должен нажать на заинтересовавший его фильм

Заключение

 

Для реализации данного приложения были использованы технологии Django3. В качестве системы управления базами данных выступает DjangoAdmin. Работа в данной базе данных осуществляется при помощи декларативным языком программирования SQLite. Данный декларативный язык программирования в связке с DjangoAdmin эффективно решает проблему передачи, хранения, и стабильного использования данных. Программное средство разработано на объектном ориентированном языке программирования Python, в среде разработки PyCharm. Было проведено множество исследований компонентов программной среды.

При выполнении курсовой работы были выполнены следующие зажачи:

1) Систематизированы знаний в области программирования с использованием языка Python.

2) Изучены декларативного языка программирования SQLite.

3) Углубление и расширение объема знаний и умений программирования на объектно-ориентированном языке Python в среде разработки программ PyCharm.

4) Сформированы умения и навыков самостоятельной организации исследовательской работы.

5) Сформированы современные методы поиска, обработки и использования информации.

6) Анализ похожих программ на просторе интернета.

7) Углублены знаний и умений в использовании технологии построения веб приложений Django3.

Проект может быть доработан путём оптимизации кода с использованием более производительных конструкций кода программы. А также добавлением нового функционала в приложении.


 

Приложение А

(обязательное)

Листинг программы

 

from django.db.models import Q

from django.http import JsonResponse, HttpResponse

from django.shortcuts import redirect

from django.views.generic import ListView, DetailView

from django.views.generic.base import View

 

from.models import Movie, Category, Actor, Director, Genre, Rating, Reviews

from.forms import ReviewForm, RatingForm

 

class GenreYear:

 """Жанры и года выхода фильмов"""

def get_genres(self):

   return Genre.objects.all()

 

def get_years(self):

   return Movie.objects.filter(draft=False).values("year").distinct()

   

 

class MoviesView(GenreYear, ListView):

"""Список фильмов"""

model = Movie

queryset = Movie.objects.filter(draft=False)

paginate_by = 6

 

class MovieDetailView(GenreYear, DetailView):

"""Полное описание фильма"""

model = Movie

queryset = Movie.objects.filter(draft=False)

slug_field = "url"

 

def get_context_data(self, **kwargs):

   context = super().get_context_data(**kwargs)

   context["star_form"] = RatingForm()

   return context

 

class AddReview(View):

"""Отзывы"""

def post(self, request, pk):

   form = ReviewForm(request.POST)

   movie = Movie.objects.get(id=pk)

   if form.is_valid():

       form = form.save(commit=False)

       if request.POST.get("parent", None):

           form.parent_id = int(request.POST.get("parent"))

       form.movie = movie

       form.save()

   return redirect(movie.get_absolute_url())

 

class ActorView(GenreYear, DetailView):

"""Вывод информации о актере"""

model = Actor

template_name = 'movies/actor.html'

slug_field = "name"

 

class DirectorView(DetailView):

"""Вывод информации о Director"""

model = Director

template_name = 'movies/director.html'

slug_field = "name"

 

class FilterMoviesView(GenreYear, ListView):

"""Фильтр фильмов"""

paginate_by = 3

 

def get_queryset(self):

   queryset = Movie.objects.filter(

       Q(year__in=self.request.GET.getlist("year")) |

       Q(category__in=self.request.GET.getlist("category")) |

       Q(genres__in=self.request.GET.getlist("genre"))

  ).distinct()

   return queryset

       

def get_context_data(self, *args, **kwargs):

   context = super().get_context_data(*args, **kwargs)

   context["year"] = ''.join([f"year={x}&" for x in self.request.GET.getlist("year")])

   context["category"] = ''.join([f"category={x}&" for x in self.request.GET.getlist("category")])

   context["genre"] = ''.join([f"genre={x}&" for x in self.request.GET.getlist("genre")])

   return context

 

class JsonFilterMoviesView(ListView):

"""Фильтр фильмов в json"""

def get_queryset(self):

   queryset = Movie.objects.filter(

       Q(year__in=self.request.GET.getlist("year")) |

       Q(category__in=self.request.GET.getlist("category")) |

       Q(genres__in=self.request.GET.getlist("genre"))

  ).distinct().values("title", "tagline", "url", "poster")

   return queryset

 

def get(self, request, *args, **kwargs):

   queryset = list(self.get_queryset())

   return JsonResponse({"movies": queryset}, safe=False)

 

class AddStarRating(View):

"""Добавление рейтинга фильму"""

def get_client_ip(self, request):

   x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')

   if x_forwarded_for:

       ip = x_forwarded_for.split(',')[0]

   else:

       ip = request.META.get('REMOTE_ADDR')

   return ip

 

def post(self, request):

   form = RatingForm(request.POST)

   if form.is_valid():

       Rating.objects.update_or_create(

           ip=self.get_client_ip(request),

           movie_id=int(request.POST.get("movie")),

           defaults={'star_id': int(request.POST.get("star"))}

      )

       return HttpResponse(status=201)

   else:

       return HttpResponse(status=400)

 

class Search(ListView):

"""Поиск фильмов"""

paginate_by = 6

 

def get_queryset(self):

   return Movie.objects.filter(title__icontains=self.request.GET.get("q"))

 

def get_context_data(self, *args, **kwargs):

   context = super().get_context_data(*args, **kwargs)

   context["q"] = f'q={self.request.GET.get("q")}&'

   return context

 

from django import forms

 

from.models import Reviews, Rating, RatingStar

 

class ReviewForm(forms.ModelForm):

"""Форма отзывов"""

class Meta:

   model = Reviews

   fields = ("name", "email", "text")

 

class RatingForm(forms.ModelForm):

"""Форма добавления рейтинга"""

star = forms.ModelChoiceField(

   queryset=RatingStar.objects.all(), widget=forms.RadioSelect(), empty_label=None

)

 

class Meta:

   model = Rating

   fields = ("star",)

 

from django import forms

from django.contrib import admin

from django.utils.safestring import mark_safe

 

from.models import Category, Genre, Movie, MovieShots, Actor, Rating, RatingStar, Reviews, Director

 

from ckeditor_uploader.widgets import CKEditorUploadingWidget

 

class MovieAdminForm(forms.ModelForm):

description = forms.CharField(label="Описание", widget=CKEditorUploadingWidget())

 

class Meta:

   model = Movie

   fields = '__all__'

 


@admin.register(Category)

class CategoryAdmin(admin.ModelAdmin):

"""Категории"""

list_display = ("id", "name", "url")

list_display_links = ("name",)

 

class ReviewInline(admin.TabularInline):

"""Отзывы на странице фильма"""

model = Reviews

extra = 1

readonly_fields = ("name", "email")

 

class MovieShotsInline(admin.TabularInline):

model = MovieShots

extra = 1

readonly_fields = ("get_image",)

 

def get_image(self, obj):

   return mark_safe(f'<img src={obj.image.url} height="110"')

 

get_image.short_description = "Изображение"

 


@admin.register(Movie)

class MovieAdmin(admin.ModelAdmin):

"""Фильмы"""

list_display = ("title", "category", "url", "draft")

list_filter = ("category", "year")

search_fields = ("title", "category__name")

inlines = [MovieShotsInline, ReviewInline]

save_on_top = True

save_as = True

list_editable = ("draft",)

actions = ["publish", "unpublish"]

form = MovieAdminForm

readonly_fields = ("get_image",)

fieldsets = (

   (None, {

       "fields": (("title", "tagline"),)

   }),

   (None, {

       "fields": ("description", ("poster", "get_image"))

   }),

   (None, {

       "fields": (("year", "world_premiere", "country"),)

   }),

   ("Actors", {

       "classes": ("collapse",),

       "fields": (("actors", "directors", "genres", "category"),)

   }),

   (None, {

       "fields": (("budget", "fees_in_usa", "fess_in_world"),)

   }),

   ("Options", {

       "fields": (("url", "draft"),)

   }),

)

 

def get_image(self, obj):

   return mark_safe(f'<img src={obj.poster.url} height="110"')

 

def unpublish(self, request, queryset):

   row_update = queryset.update(draft=True)

   if row_update == 1:

       message_bit = "1 запись была обновлена"

   else:

       message_bit = f"{row_update} записей были обновлены"

   self.message_user(request, f"{message_bit}")

 

def publish(self, request, queryset):

   """Опубликовать"""

   row_update = queryset.update(draft=False)

   if row_update == 1:

       message_bit = "1 запись была обновлена"

   else:

       message_bit = f"{row_update} записей были обновлены"

   self.message_user(request, f"{message_bit}")

 

publish.short_description = "Опубликовать"

publish.allowed_permissions = ('change',)

 

unpublish.short_description = "Снять с публикации"

unpublish.allowed_permissions = ('change',)

   

get_image.short_description = "Постер"

 

@admin.register(Reviews)

class ReviewAdmin(admin.ModelAdmin):

"""Отзывы"""

list_display = ("name", "email", "parent", "movie", "id")

readonly_fields = ("name", "email")

 

@admin.register(Genre)

class GenreAdmin(admin.ModelAdmin):

"""Жанры"""

list_display = ("name", "url")

 

@admin.register(Actor)

class ActorAdmin(admin.ModelAdmin):

"""Актеры"""

list_display = ("name", "age", "get_image")

readonly_fields = ("get_image",)

 

def get_image(self, obj):

   return mark_safe(f'<img src={obj.image.url} height="60"')

 

get_image.short_description = "Изображение"

 

@admin.register(Director)

class DirectorAdmin(admin.ModelAdmin):

"""Режиссеры"""

list_display = ("name", "age", "get_image")

readonly_fields = ("get_image",)

 

def get_image(self, obj):

   return mark_safe(f'<img src={obj.image.url} height="60"')

 

get_image.short_description = "Изображение"

 

@admin.register(Rating)

class RatingAdmin(admin.ModelAdmin):

"""Рейтинг"""

list_display = ("star", "movie", "ip")

 

@admin.register(MovieShots)

class MovieShotsAdmin(admin.ModelAdmin):

"""Кадры из фильма"""

list_display = ("title", "movie", "get_image")

readonly_fields = ("get_image",)

 

def get_image(self, obj):

   return mark_safe(f'<img src={obj.image.url} height="60"')

 

get_image.short_description = "Изображение"

 

admin.site.register(RatingStar)

 

admin.site.site_title = "WikiFilms"

admin.site.site_header = "WikiFilms"

 

function ajaxSend(url, params) {

// Отправляем запрос

fetch(`${url}?${params}`, {

   method: 'GET',

   headers: {

       'Content-Type': 'application/x-www-form-urlencoded',

   },

})

  .then(response => response.json())

  .then(json => render(json))

  .catch(error => console.error(error))

}

 

function render(data) {

// Рендер шаблона

let template = Hogan.compile(html);

let output = template.render(data);

 

const div = document.querySelector('.left-ads-display>.row');

div.innerHTML = output;

}

 

let html = '\

{{#movies}}\

<div class="col-md-4 product-men">\

   <div class="product-shoe-info editContent text-center mt-lg-4">\

       <div class="men-thumb-item">\

           <img src="media/{{ poster }}" class="img-fluid" alt="">\

       </div>\

       <div class="item-info-product">\

           <h4 class="">\

               <a href="/{{ url }}" class="editContent">{{ title }}</a>\

           </h4>\

           <div class="product_price">\

               <div class="grid-price">\

                   <span class="money editContent">{{ tagline }}</span>\

               </div>\

           </div>\

           <ul class="stars">\

               <li><a href="#"><span class="fa fa-star" aria-hidden="true"></span></a></li>\

               <li><a href="#"><span class="fa fa-star" aria-hidden="true"></span></a></li>\

               <li><a href="#"><span class="fa fa-star-half-o" aria-hidden="true"></span></a></li>\

               <li><a href="#"><span class="fa fa-star-half-o" aria-hidden="true"></span></a></li>\

               <li><a href="#"><span class="fa fa-star-o" aria-hidden="true"></span></a></li>\

           </ul>\

       </div>\

   </div>\

</div>\

{{/movies}}'

 

// Add star rating

const rating = document.querySelector('form[name=rating]');

 

rating.addEventListener("change", function (e) {

// Получаем данные из формы

let data = new FormData(this);

fetch(`${this.action}`, {

   method: 'POST',

   body: data

})

  .then(response => alert("Рейтинг установлен"))

  .catch(error => alert("Ошибка"))

});

 

{% extends 'movies/base.html' %}

{% load static %}

{% block title %} {{ actor.name }} {% endblock title %}

{% block container %}

<div class="container py-md-3">

{% endblock container %}

 

{% block sidebar %}

<div class="side-bar col-lg-4">

{% endblock sidebar %}

 

{% block movie %}

<div class="left-ads-display col-lg-8">

   <div class="row">

       <div class="desc1-left col-md-6">

           <img src="{{ actor.image.url }}" class="img-fluid" alt="">

       </div>

       <div class="desc1-right col-md-6 pl-lg-4">

           <h3 class="editContent">

               {{ movie.title }}

           </h3>

           <h5 class="editContent"></h5>

           <ul>

               <li>

                   <span><b>Возраст:</b> {{ actor.age }} лет</span>

               </li>

               <li><span><b>Актер:</b>

                   {% for movie in actor.film_actor.all %}

                       {{ movie.title }}

                   {% endfor %}

               </span>

               </li>

           </ul>

       </div>

   </div>

   <div class="row sub-para-w3layouts mt-5">

       <h3 class="shop-sing editContent">

           О {{ actor.name }}

       </h3>

       <p class="editContent">

           {{ actor.description|safe }}

       </p>

   </div>

</div>

{% endblock movie %}

 

{% extends 'base.html' %}

{% block title %} {% endblock title %}

{% block content %}

<section class="ab-info-main py-md-5 py-4 editContent"

        style="padding-left: 3rem; padding-right: 3rem;">

   {% block container %}

       <div class="container-fluid py-md-3">

   {% endblock container %}

   <div class="row">

       {% block sidebar %}

           <div class="side-bar col-lg-3">

       {% endblock sidebar %}

       {% include 'include/sidebar.html' %}

       </div>

       {% block movie %}

       {% endblock movie %}

   </div>

   </div>

</section>

{% endblock content %}

 

{% extends 'movies/base.html' %}

{% load static %}

{% block title %} {{ director.name }} {% endblock title %}

{% block container %}

<div class="container py-md-3">

{% endblock container %}

 

{% block sidebar %}

<div class="side-bar col-lg-4">

{% endblock sidebar %}

 

{% block movie %}

<div class="left-ads-display col-lg-8">

   <div class="row">

       <div class="desc1-left col-md-6">

           <img src="{{ director.image.url }}" class="img-fluid" alt="">

       </div>

       <div class="desc1-right col-md-6 pl-lg-4">

           <h3 class="editContent">

               {{ movie.title }}

           </h3>

           <h5 class="editContent"></h5>

           <ul>

               <li>

                   <span><b>Возраст:</b> {{ director.age }} лет</span></li>

               <li>

                   <span><b>Режиссер:</b>

                       {% for movie in director.film_director.all %}

                           {{ movie.title }}

                       {% endfor %}

                   </span>

               </li>

               </li>

           </ul>

       </div>

   </div>

   <div class="row sub-para-w3layouts mt-5">

       <h3 class="shop-sing editContent">

           О {{ director.name }}

       </h3>

       <p class="editContent">

           {{ director.description|safe }}

       </p>

   </div>

</div>

{% endblock movie %}

 

{% extends 'movies/base.html' %}

{% load static %}

{% block title %} {{ movie.title }} {% endblock title %}

{% block container %}

<div class="container py-md-3">

{% endblock container %}

 

{% block sidebar %}

<div class="side-bar col-lg-4">

{% endblock sidebar %}

 

{% block movie %}

<div class="left-ads-display col-lg-8">

   <div class="row">

       <div class="desc1-left col-md-6">

           <img src="{{ movie.poster.url }}" class="img-fluid" alt="">

       </div>

       <div class="desc1-right col-md-6 pl-lg-4">

           <h3 class="editContent">

               {{ movie.title }}

           </h3>

           <h5 class="editContent"></h5>

           <ul>

               <li style="list-style: none">

                   <span><b>Год:</b> {{ movie.year }}</span></li>

               <li style="list-style: none">

                   <span><b>Страна:</b> {{ movie.country }}</span>

               </li>

               <li style="list-style: none">

                   <span><b>Слоган:</b> {{ movie.tagline }}</span>

               </li>

               <li style="list-style: none">

                   <span><b>Режиссер:</b>

                       {% for director in movie.directors.all %}

                           <a href="{{ director.get_absolute_url }}">

                               {{ director.name }}

                           </a>

                         {% endfor %}

                   </span>

               </li>

               <li style="list-style: none"><span><b>Актеры:</b>

                   {% for actor in movie.actors.all %}

                       <a href="{{ actor.get_absolute_url }}">

                               {{ actor.name }}

                       </a>

                   {% endfor %}

                           </span>

               </li>

               <li style="list-style: none"><span><b>Жанр:</b>

                   {% for genre in movie.genres.all %}

                       {{ genre.name }}

                   {% endfor %}

                               </span>

               </li>

               <li style="list-style: none">

                   <span><b>Премьера в мире:</b> {{ movie.world_premiere }}</span>

               </li>

               <li style="list-style: none">

                   <span><b>Бюджет:</b> ${{ movie.budget }}</span></li>

               <li style="list-style: none">

                   <span><b>Сборы в США:</b> ${{ movie.fees_in_usa }}</span></li>

               <li style="list-style: none">

                   <span><b>Сборы в мире:</b> ${{ movie.fess_in_world }}</span>

               </li>

               <li style="list-style: none">

                   <form action="{% url 'add_rating' %}" method="post" name="rating">

                       <b>Рейтинг:</b>

                       {% csrf_token %}

                       <input type="hidden" value="{{ movie.id }}" name="movie">

                       <span class="rating">

                           {% for k, v in star_form.fields.star.choices %}

                               <input id="rating{{ v }}" type="radio" name="star" value="{{ k }}">

                               <label for="rating{{ v }}">{{ v }}</label>

                           {% endfor %}

                       </span>

                       <span class="editContent">{{ k }}

                       </span>

                   </form>

               </li>

           </ul> 

       </div>

   </div>

       

   <div class="row sub-para-w3layouts mt-5">

 

       <h3 class="shop-sing editContent">

           О фильме {{ movie.title }}

       </h3>

       <p>

           {% for image in movie.movieshots_set.all %}

               <img src="{{ image.image.url }}" class="img-movie-shots "

                    alt="{{ image.description }}">

           {% endfor %}

       </p>

       <p class="editContent">

           {{ movie.description|safe }}

       </p>

   </div>

   <hr>

   <div class="row">

       <div class="single-form-left">

           <!-- contact form grid -->

           <div class="contact-single">

               <h3 class="editContent">

                   <span class="sub-tittle editContent">{{ movie.reviews_set.count }}</span>Оставить

                   отзыв</h3>

               <form action="{% url 'add_review' movie.id %}" method="post" class="mt-4"

                     id="formReview">

                   {% csrf_token %}

                   <input type="hidden" name="parent" id="contactparent" value="">

                   <div class="form-group editContent">

                       <label for="contactcomment" class="editContent">

                           Ваш комментарий *

                       </label>

                       <textarea class="form-control border" rows="5" name="text"

                                 id="contactcomment" required=""></textarea>

                   </div>

                   <div class="d-sm-flex">

                       <div class="col-sm-6 form-group p-0 editContent">

                           <label for="contactusername" class="editContent">

                               Имя *

                           </label>

                           <input type="text" class="form-control border" name="name"

                                  id="contactusername" required="">

                       </div>

                       <div class="col-sm-6 form-group ml-sm-3 editContent">

                           <label for="contactemail" class="editContent">

                               Email *

                           </label>

                           <input type="email" class="form-control border" name="email"

                                  id="contactemail" required="">

                       </div>

                   </div>

                   <button type="submit"

                           class="mt-3 btn btn-success btn-block py-3">

                       Отправить

                   </button>

               </form>

           </div>

           <!-- //contact form grid ends here -->

       </div>

   </div>

   {% for review in movie.get_review %}

       <div class="media py-5">

           <img src="{% static 'images/te.png' %}" class="mr-3 img-fluid" alt="image">

           <div class="media-body mt-4">

               <h5 class="mt-0 editContent">

                   {{ review.name }}

               </h5>

               <p class="mt-2 editContent">

                   {{ review.text }}

               </p>

               <a href="#formReview"

                  onclick="addReview('{{ review.name }}', '{{ review.id }}')">Ответить</a>

               {% for rew in review.reviews_set.all %}

                   <div class="media mt-5 editContent">

                       <a class="pr-3" href="#">

                           <img src="{% static 'images/te.png' %}" class="img-fluid "

                                alt="image">

                       </a>

                       <div class="media-body">

                           <h5 class="mt-0 editContent">{{ rew.name }}</h5>

                           <p class="mt-2 editContent">{{ rew.text }}</p>

                       </div>

                   </div>

               {% endfor %}

           </div>

       </div>

   {% endfor %}

</div>

<script>

   function addReview(name, id) {

       document.getElementById("contactparent").value = id;

       document.getElementById("contactcomment").innerText = `${name}, `

   }

 

</script>

{% endblock movie %}

 

{% extends 'movies/base.html' %}

{% block title %} {% endblock title %}

{% block header %} bg1 {% endblock header %}

{% block movie %}

<div class="left-ads-display col-lg-9">

   <div class="row">

       {% for movie in movie_list %}

           <div class="col-md-4 product-men">

               <div class="product-shoe-info editContent text-center mt-lg-4">

                   <div class="men-thumb-item">

                       <img src="{{ movie.poster.url }}" class="img-fluid" alt="">

                   </div>

                   <div class="item-info-product">

                       <h4 class="">

                           <a href="{{ movie.get_absolute_url }}"

                              class="editContent">

                               {{ movie.title }}

                           </a>

                       </h4>

 

                       <div class="product_price">

                           <div class="grid-price">

                               <span class="money editContent">{{ movie.tagline }}</span>

                           </div>

                       </div>

                          

                   </div>

               </div>

           </div>

       {% endfor %}

   </div>



Поделиться:


Последнее изменение этой страницы: 2021-05-12; просмотров: 110; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.135.125 (0.68 с.)