gr421_vidol 1 jaar geleden
commit
714455b30a
37 gewijzigde bestanden met toevoegingen van 743 en 0 verwijderingen
  1. 8 0
      .idea/.gitignore
  2. 10 0
      .idea/VinichenkoEGZ.iml
  3. 6 0
      .idea/inspectionProfiles/profiles_settings.xml
  4. 7 0
      .idea/misc.xml
  5. 8 0
      .idea/modules.xml
  6. 6 0
      .idea/vcs.xml
  7. BIN
      egzamen/db.sqlite3
  8. 0 0
      egzamen/egzamen/__init__.py
  9. 16 0
      egzamen/egzamen/asgi.py
  10. 124 0
      egzamen/egzamen/settings.py
  11. 25 0
      egzamen/egzamen/urls.py
  12. 16 0
      egzamen/egzamen/wsgi.py
  13. 0 0
      egzamen/main/__init__.py
  14. 5 0
      egzamen/main/admin.py
  15. 6 0
      egzamen/main/apps.py
  16. 59 0
      egzamen/main/forms.py
  17. 159 0
      egzamen/main/migrations/0001_initial.py
  18. 0 0
      egzamen/main/migrations/__init__.py
  19. 22 0
      egzamen/main/models.py
  20. 11 0
      egzamen/main/templates/Login.html
  21. 15 0
      egzamen/main/templates/Product.html
  22. 12 0
      egzamen/main/templates/ProductOne.html
  23. 55 0
      egzamen/main/templates/base.html
  24. 12 0
      egzamen/main/templates/index.html
  25. 12 0
      egzamen/main/templates/main/product_list.html
  26. 8 0
      egzamen/main/templates/profile.html
  27. 12 0
      egzamen/main/templates/register.html
  28. 16 0
      egzamen/main/templates/search_results.html
  29. 3 0
      egzamen/main/tests.py
  30. 14 0
      egzamen/main/urls.py
  31. 74 0
      egzamen/main/views.py
  32. 22 0
      egzamen/manage.py
  33. BIN
      egzamen/media/255095-Sepik.jpg
  34. BIN
      egzamen/media/255095-Sepik_AcaiBvY.jpg
  35. BIN
      egzamen/media/255095-Sepik_DRDBZ5Q.jpg
  36. BIN
      egzamen/media/255095-Sepik_Ebl4fsv.jpg
  37. BIN
      egzamen/media/bugatti-veyron-164-super-sport-bystryj-superkar-giperkar-chernyj-oranzhevyj.jpg

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 10 - 0
.idea/VinichenkoEGZ.iml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.venv" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 6 - 0
.idea/inspectionProfiles/profiles_settings.xml

@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>

+ 7 - 0
.idea/misc.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Black">
+    <option name="sdkName" value="Python 3.10 (VinichenkoEGZ)" />
+  </component>
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (VinichenkoEGZ)" project-jdk-type="Python SDK" />
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/VinichenkoEGZ.iml" filepath="$PROJECT_DIR$/.idea/VinichenkoEGZ.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

BIN
egzamen/db.sqlite3


+ 0 - 0
egzamen/egzamen/__init__.py


+ 16 - 0
egzamen/egzamen/asgi.py

@@ -0,0 +1,16 @@
+"""
+ASGI config for egzamen 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.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "egzamen.settings")
+
+application = get_asgi_application()

+ 124 - 0
egzamen/egzamen/settings.py

@@ -0,0 +1,124 @@
+"""
+Django settings for egzamen project.
+
+Generated by 'django-admin startproject' using Django 5.0.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/5.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/5.0/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.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = "django-insecure-m0t98s32325w9b19_*s#_8sd1q&yu)7_+2jrb((7g2o@d0h)-6"
+
+# 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 = "egzamen.urls"
+
+TEMPLATES = [
+    {
+        "BACKEND": "django.template.backends.django.DjangoTemplates",
+        "DIRS": [],
+        "APP_DIRS": True,
+        "OPTIONS": {
+            "context_processors": [
+                "django.template.context_processors.debug",
+                "django.template.context_processors.request",
+                "django.contrib.auth.context_processors.auth",
+                "django.contrib.messages.context_processors.messages",
+            ],
+        },
+    },
+]
+
+WSGI_APPLICATION = "egzamen.wsgi.application"
+
+# Database
+# https://docs.djangoproject.com/en/5.0/ref/settings/#databases
+
+DATABASES = {
+    "default": {
+        "ENGINE": "django.db.backends.sqlite3",
+        "NAME": BASE_DIR / "db.sqlite3",
+    }
+}
+
+# Password validation
+# https://docs.djangoproject.com/en/5.0/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.0/topics/i18n/
+
+LANGUAGE_CODE = "en-us"
+
+TIME_ZONE = "UTC"
+
+USE_I18N = True
+
+USE_TZ = True
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/5.0/howto/static-files/
+
+STATIC_URL = "static/"
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
+
+LOGIN_REDIRECT_URL = '/'
+
+LOGOUT_REDIRECT_URL = '/'
+
+AUTH_USER_MODEL = 'main.AdvUser'

+ 25 - 0
egzamen/egzamen/urls.py

@@ -0,0 +1,25 @@
+"""
+URL configuration for egzamen project.
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+    https://docs.djangoproject.com/en/5.0/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.conf import settings
+from django.conf.urls.static import static
+from django.contrib import admin
+from django.urls import path, include
+
+urlpatterns = [
+    path("admin/", admin.site.urls),
+    path("", include("main.urls"))
+]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 16 - 0
egzamen/egzamen/wsgi.py

@@ -0,0 +1,16 @@
+"""
+WSGI config for egzamen 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.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "egzamen.settings")
+
+application = get_wsgi_application()

+ 0 - 0
egzamen/main/__init__.py


+ 5 - 0
egzamen/main/admin.py

@@ -0,0 +1,5 @@
+from django.contrib import admin
+from .models import *
+
+admin.site.register(Product)
+admin.site.register(AdvUser)

+ 6 - 0
egzamen/main/apps.py

@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class MainConfig(AppConfig):
+    default_auto_field = "django.db.models.BigAutoField"
+    name = "main"

+ 59 - 0
egzamen/main/forms.py

@@ -0,0 +1,59 @@
+
+from .models import *
+import re
+from django import forms
+from django.contrib.auth import password_validation
+from django.core.exceptions import ValidationError
+from django.forms import ModelForm
+
+
+class ProductCreate(ModelForm):
+    class Meta:
+        model = Product
+        fields = ('name', 'desc', 'title', 'image')
+
+
+class RegisterUserForm(ModelForm):
+    email = forms.EmailField(required=True,
+                             label='Адрес электронной почты')
+    password1 = forms.CharField(label='Пароль',
+                                widget=forms.PasswordInput,
+                                help_text=password_validation.password_validators_help_text_html())
+    password2 = forms.CharField(label='Пароль (повторно)',
+                                widget=forms.PasswordInput,
+                                help_text='Повторите тот же самый пароль еще раз')
+
+    def clean(self):
+        super().clean()
+        password1 = self.cleaned_data['password1']
+        password2 = self.cleaned_data['password2']
+        if password1 and password2 and password1 != password2:
+            errors = {'password2': ValidationError(
+                'Введенные пароли не совпадают', code='password_mismatch'
+            )}
+            raise ValidationError(errors)
+
+    def save(self, commit=True):
+        user = super().save(commit=False)
+        user.set_password(self.cleaned_data['password1'])
+        if commit:
+            user.save()
+        return user
+
+    def clean_name(self):
+        name = self.cleaned_data['name']
+        if not re.match(r'^[а-яА-Я\s-]+$', name):
+            raise ValidationError("ФИО может содержать только кириллицу, дефис и пробелы. ")
+        return name
+
+    def clean_login(self):
+        username = self.cleaned_data['username']
+        if not re.match(r'^[a-zA-Z\s-]+$', username):
+            raise ValidationError("Логин может содержать только латиницу и дефис. ")
+        if AdvUser.objects.filter(username=username).exists():
+            raise ValidationError("Пользователь с таким логином уже существует. ")
+        return username
+
+    class Meta:
+        model = AdvUser
+        fields = ('username', 'name', 'email', 'password1', 'password2')

+ 159 - 0
egzamen/main/migrations/0001_initial.py

@@ -0,0 +1,159 @@
+# Generated by Django 4.2.8 on 2023-12-26 02:53
+
+import django.contrib.auth.models
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+    initial = True
+
+    dependencies = [
+        ("auth", "0012_alter_user_first_name_max_length"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="Product",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "image",
+                    models.ImageField(upload_to="media/", verbose_name="Картинка"),
+                ),
+                ("name", models.CharField(max_length=100)),
+                ("desc", models.TextField(max_length=500)),
+                ("title", models.CharField(default="Product", max_length=100)),
+            ],
+        ),
+        migrations.CreateModel(
+            name="AdvUser",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("password", models.CharField(max_length=128, verbose_name="password")),
+                (
+                    "last_login",
+                    models.DateTimeField(
+                        blank=True, null=True, verbose_name="last login"
+                    ),
+                ),
+                (
+                    "is_superuser",
+                    models.BooleanField(
+                        default=False,
+                        help_text="Designates that this user has all permissions without explicitly assigning them.",
+                        verbose_name="superuser status",
+                    ),
+                ),
+                (
+                    "first_name",
+                    models.CharField(
+                        blank=True, max_length=150, verbose_name="first name"
+                    ),
+                ),
+                (
+                    "last_name",
+                    models.CharField(
+                        blank=True, max_length=150, verbose_name="last name"
+                    ),
+                ),
+                (
+                    "email",
+                    models.EmailField(
+                        blank=True, max_length=254, verbose_name="email address"
+                    ),
+                ),
+                (
+                    "is_staff",
+                    models.BooleanField(
+                        default=False,
+                        help_text="Designates whether the user can log into this admin site.",
+                        verbose_name="staff status",
+                    ),
+                ),
+                (
+                    "is_active",
+                    models.BooleanField(
+                        default=True,
+                        help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
+                        verbose_name="active",
+                    ),
+                ),
+                (
+                    "date_joined",
+                    models.DateTimeField(
+                        default=django.utils.timezone.now, verbose_name="date joined"
+                    ),
+                ),
+                (
+                    "name",
+                    models.CharField(
+                        help_text="Только кириллические буквы, дефис и пробелы",
+                        max_length=250,
+                        verbose_name="ФИО",
+                    ),
+                ),
+                (
+                    "username",
+                    models.CharField(
+                        help_text="Только латиница и дефис, уникальный",
+                        max_length=35,
+                        unique=True,
+                        verbose_name="Логин",
+                    ),
+                ),
+                (
+                    "avatar",
+                    models.ImageField(
+                        default=None, upload_to="media/", verbose_name="Аватарка"
+                    ),
+                ),
+                (
+                    "groups",
+                    models.ManyToManyField(
+                        blank=True,
+                        help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
+                        related_name="user_set",
+                        related_query_name="user",
+                        to="auth.group",
+                        verbose_name="groups",
+                    ),
+                ),
+                (
+                    "user_permissions",
+                    models.ManyToManyField(
+                        blank=True,
+                        help_text="Specific permissions for this user.",
+                        related_name="user_set",
+                        related_query_name="user",
+                        to="auth.permission",
+                        verbose_name="user permissions",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "user",
+                "verbose_name_plural": "users",
+                "abstract": False,
+            },
+            managers=[
+                ("objects", django.contrib.auth.models.UserManager()),
+            ],
+        ),
+    ]

+ 0 - 0
egzamen/main/migrations/__init__.py


+ 22 - 0
egzamen/main/models.py

@@ -0,0 +1,22 @@
+from django.db import models
+from django.contrib.auth.models import AbstractUser
+
+
+# Create your models here.
+
+class Product(models.Model):
+    image = models.ImageField(upload_to="media/", verbose_name="Картинка")
+    name = models.CharField(max_length=100)
+    desc = models.TextField(max_length=500)
+    title = models.CharField(max_length=100, default="Product")
+
+
+class AdvUser(AbstractUser):
+    name = models.CharField(max_length=250, verbose_name="ФИО", help_text="Только кириллические буквы, дефис и пробелы")
+    username = models.CharField(max_length=35, verbose_name="Логин", unique=True,
+                                help_text="Только латиница и дефис, уникальный")
+    avatar = models.ImageField(upload_to="media/", verbose_name="Аватарка", default= None)
+
+
+class Meta(AbstractUser.Meta):
+    pass

+ 11 - 0
egzamen/main/templates/Login.html

@@ -0,0 +1,11 @@
+{% extends "base.html" %}
+{% load static %}
+{% block content %}
+<div class="container">
+<form method="post">
+  {% csrf_token %}
+  {{form.as_p}}
+  <button type="submit" class="btn btn-primary">Войти</button>
+</form>
+</div>
+{% endblock %}

+ 15 - 0
egzamen/main/templates/Product.html

@@ -0,0 +1,15 @@
+{% extends "base.html" %}
+{% load static %}
+{% block content %}
+<div class="container">
+    <div>
+        <H1>Все товары</h1>
+    </div><br><br>
+{% for i in Servise %}
+    <h3>Имя:{{i.name}}</h3>
+    <p>Тип:{{i.title}}</p>
+    <img src="{{i.image.url}}" width="450px" height="450px"><br><br>
+    <a class="btn btn-primary" href="{% url 'product-one' i.id %}">Узнать больше</a>
+{%endfor%}
+</div>
+{% endblock %}

+ 12 - 0
egzamen/main/templates/ProductOne.html

@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% load static %}
+{% block content %}
+<div class="container">
+{% for i in productone %}
+    <h3>Имя:{{i.name}}</h3>
+    <p>Тип:{{i.title}}</p>
+    <p>Описание:{{i.desc}}</p>
+    <img src="{{i.image.url}}" width="450px" height="450px">
+{%endfor%}
+</div>
+{% endblock %}

+ 55 - 0
egzamen/main/templates/base.html

@@ -0,0 +1,55 @@
+<head>
+    <title>Сайт</title>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
+          integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
+    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
+            integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
+            crossorigin="anonymous"></script>
+    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.12.9/dist/umd/popper.min.js"
+            integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
+            crossorigin="anonymous"></script>
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/js/bootstrap.min.js"
+            integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
+            crossorigin="anonymous"></script>
+</head>
+<body>
+<nav class="navbar navbar-expand-lg navbar-light bg-light">
+    <a class="navbar-brand" href="#">Navbar</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
+            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+
+    <div class="collapse navbar-collapse" id="navbarSupportedContent">
+        <ul class="navbar-nav mr-auto">
+            <li class="nav-item active">
+                <a class="nav-link" href="/">Главная <span class="sr-only">(current)</span></a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'service' %}">Товары</a>
+            </li>
+            {% if user.is_authenticated%}
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'profile' %}">Профиль</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'logout' %}">Выход</a>
+            </li>
+            {% else %}
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'register' %}">Регистрация</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'login' %}">Вход</a>
+            </li>
+            {% endif %}
+        </ul>
+        <form action="{% url 'search' %}" method="get" class="form-inline my-2 my-lg-0">
+            <input name="q" class="form-control mr-sm-2" type="search" placeholder="поиск" aria-label="Search">
+            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Найти</button>
+        </form>
+    </div>
+</nav>
+<div>{% block content %}{% endblock %}</div>
+<div
+</body>

+ 12 - 0
egzamen/main/templates/index.html

@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% load static %}
+{% block content %}
+<div class="container">
+{% for i in product %}
+    <h3>Имя:{{i.name}}</h3>
+    <p>Тип:{{i.title}}</p>
+    <img src="{{i.image.url}}" width="450px" height="450px"><br><br>
+    <a class="btn btn-primary" href="{% url 'product-one' i.id %}">Узнать больше</a><br><br>
+{%endfor%}
+</div>
+{% endblock %}

+ 12 - 0
egzamen/main/templates/main/product_list.html

@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% load static %}
+{% block content %}
+<div class="container">
+
+    <h3>Имя:{{i.name}}</h3>
+    <p>Тип:{{i.title}}</p>
+    <p>Описание:{{i.desc}}</p>
+    <img src="{{i.image.url}}" width="450px" height="450px">
+
+</div>
+{% endblock %}

+ 8 - 0
egzamen/main/templates/profile.html

@@ -0,0 +1,8 @@
+{% extends "base.html" %}
+{% load static %}
+{% block content %}
+<div class="container">
+    <h3>Имя: {{user.name}}</h3>
+    <img src="{{user.avatar.url}}" width="150px" height="150px">
+</div>
+{% endblock %}

+ 12 - 0
egzamen/main/templates/register.html

@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% load static %}
+{% block content %}
+<div class="container">
+  <form method="POST" enctype="multipart/form-data">
+	  <h2>Регистрация</h2>
+	  {% csrf_token %}
+	  {{ form.as_p }}
+	<input type="submit" class="btn btn-primary" value="Зарегистрироваться">
+</form>
+</div>
+{% endblock %}

+ 16 - 0
egzamen/main/templates/search_results.html

@@ -0,0 +1,16 @@
+{% extends "base.html" %}
+{% load static %}
+{% block content %}
+<div class="container">
+<ul>
+  {% for it in object_list %}
+    <li>
+        <h3>Имя:{{it.name}}</h3>
+    <p>Тип:{{it.title}}</p>
+    <p>Описание:{{it.desc}}</p>
+    <img src="{{it.image.url}}" width="450px" height="450px">
+    </li>
+  {% endfor %}
+</ul>
+</div>
+{% endblock %}

+ 3 - 0
egzamen/main/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 14 - 0
egzamen/main/urls.py

@@ -0,0 +1,14 @@
+from . import views
+from .views import *
+from django.urls import path
+
+urlpatterns = [
+    path('', views.ProductView.as_view(), name='index'),
+    path('login/', views.Login.as_view(), name='login'),
+    path('logout/', views.Logout.as_view(), name='logout'),
+    path('profile/', views.Profile.as_view(), name='profile'),
+    path('register/', RegisterUser.as_view(), name='register'),
+    path('service/', ServiceView.as_view(), name='service'),
+    path('service/<int:pk>/', views.ProductOneView.as_view(), name='product-one'),
+    path('search_result/', views.SearchResultsView.as_view(), name='search')
+]

+ 74 - 0
egzamen/main/views.py

@@ -0,0 +1,74 @@
+from django.contrib.auth.views import LoginView, LogoutView
+from django.db.models import Q
+from django.shortcuts import render
+from django.urls import reverse_lazy
+from django.views import generic
+from django.views.generic import TemplateView, CreateView
+from .forms import *
+from .models import *
+
+
+# Create your views here.
+
+class ProductView(generic.ListView):
+    model = Product
+    template_name = 'index.html'
+    context_object_name = 'product'
+
+    def get_queryset(self):
+        return Product.objects.filter()[:5]
+
+
+class Login(LoginView):
+    template_name = 'Login.html'
+
+
+class Logout(LogoutView):
+    success_url = 'index.html'
+
+
+class CreateProduct(CreateView):
+    form_class = ProductCreate
+    model = Product
+    success_url = '/'
+
+
+class RegisterUser(CreateView):
+    success_url = reverse_lazy('index')
+    template_name = 'register.html'
+    form_class = RegisterUserForm
+
+
+class ServiceView(generic.ListView):
+    model = Product
+    template_name = 'Product.html'
+    context_object_name = 'Servise'
+
+
+class Profile(TemplateView):
+    template_name = 'profile.html'
+
+
+class ProductOneView(generic.ListView):
+    model = Product
+    template_name = 'ProductOne.html'
+    context_object_name = 'productone'
+
+    def get_queryset(self):  # new
+        query = self.request.GET.get("q")
+        object_list = Product.objects.filter(
+
+        )
+        return object_list
+
+
+class SearchResultsView(generic.ListView):
+    model = Product
+    template_name = "search_results.html"
+
+    def get_queryset(self):  # new
+        query = self.request.GET.get("q")
+        object_list = Product.objects.filter(
+            Q(name__icontains=query)
+        )
+        return object_list

+ 22 - 0
egzamen/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", "egzamen.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()

BIN
egzamen/media/255095-Sepik.jpg


BIN
egzamen/media/255095-Sepik_AcaiBvY.jpg


BIN
egzamen/media/255095-Sepik_DRDBZ5Q.jpg


BIN
egzamen/media/255095-Sepik_Ebl4fsv.jpg


BIN
egzamen/media/bugatti-veyron-164-super-sport-bystryj-superkar-giperkar-chernyj-oranzhevyj.jpg