locadm hace 1 año
commit
2f7b2b20a7
Se han modificado 43 ficheros con 1193 adiciones y 0 borrados
  1. 8 0
      .idea/.gitignore
  2. 6 0
      .idea/inspectionProfiles/profiles_settings.xml
  3. 7 0
      .idea/misc.xml
  4. 8 0
      .idea/modules.xml
  5. 10 0
      .idea/pythonProject.iml
  6. 6 0
      .idea/vcs.xml
  7. BIN
      mysite/db.sqlite3
  8. 22 0
      mysite/manage.py
  9. BIN
      mysite/media/avatars/avatar.png
  10. BIN
      mysite/media/avatars/avatar_GRVjBjp.png
  11. BIN
      mysite/media/productImages/12624.750x0.jpg
  12. BIN
      mysite/media/productImages/3f3bcb782f5caa1b024998ae2eb8bc6d.jpg
  13. BIN
      mysite/media/productImages/HTB1.DsfFVXXXXayXFXXq6xXFXXXF.jpg
  14. BIN
      mysite/media/productImages/d49b89a87c0caf6fd4bf1ad74f01f0f8.jpeg
  15. BIN
      mysite/media/productImages/l6cjt2rvxq3vtec213luz0ihucz49qxc.jpg
  16. BIN
      mysite/media/productImages/maxresdefault_live.jpg
  17. BIN
      mysite/media/productImages/maxresdefault_live_4Nsfchk.jpg
  18. 0 0
      mysite/monolit/__init__.py
  19. 9 0
      mysite/monolit/admin.py
  20. 6 0
      mysite/monolit/apps.py
  21. 9 0
      mysite/monolit/forms.py
  22. 198 0
      mysite/monolit/migrations/0001_initial.py
  23. 68 0
      mysite/monolit/migrations/0002_basket_profile_delete_orderedproduct.py
  24. 16 0
      mysite/monolit/migrations/0003_remove_user_userinfo.py
  25. 0 0
      mysite/monolit/migrations/__init__.py
  26. 29 0
      mysite/monolit/models.py
  27. 3 0
      mysite/monolit/tests.py
  28. 18 0
      mysite/monolit/urls.py
  29. 69 0
      mysite/monolit/views.py
  30. 0 0
      mysite/mysite/__init__.py
  31. 16 0
      mysite/mysite/asgi.py
  32. 120 0
      mysite/mysite/settings.py
  33. 11 0
      mysite/mysite/urls.py
  34. 16 0
      mysite/mysite/wsgi.py
  35. 66 0
      mysite/static/css/style.css
  36. 77 0
      mysite/templates/all_products.html
  37. 80 0
      mysite/templates/index.html
  38. 70 0
      mysite/templates/product_detail.html
  39. 75 0
      mysite/templates/search.html
  40. 47 0
      mysite/templates/user/login.html
  41. 28 0
      mysite/templates/user/logout.html
  42. 57 0
      mysite/templates/user/profile.html
  43. 38 0
      mysite/templates/user/register.html

+ 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

+ 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.12 (pythonProject)" />
+  </component>
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12" 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/pythonProject.iml" filepath="$PROJECT_DIR$/.idea/pythonProject.iml" />
+    </modules>
+  </component>
+</project>

+ 10 - 0
.idea/pythonProject.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="jdk" jdkName="Python 3.12" jdkType="Python SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 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
mysite/db.sqlite3


+ 22 - 0
mysite/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", "mysite.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
mysite/media/avatars/avatar.png


BIN
mysite/media/avatars/avatar_GRVjBjp.png


BIN
mysite/media/productImages/12624.750x0.jpg


BIN
mysite/media/productImages/3f3bcb782f5caa1b024998ae2eb8bc6d.jpg


BIN
mysite/media/productImages/HTB1.DsfFVXXXXayXFXXq6xXFXXXF.jpg


BIN
mysite/media/productImages/d49b89a87c0caf6fd4bf1ad74f01f0f8.jpeg


BIN
mysite/media/productImages/l6cjt2rvxq3vtec213luz0ihucz49qxc.jpg


BIN
mysite/media/productImages/maxresdefault_live.jpg


BIN
mysite/media/productImages/maxresdefault_live_4Nsfchk.jpg


+ 0 - 0
mysite/monolit/__init__.py


+ 9 - 0
mysite/monolit/admin.py

@@ -0,0 +1,9 @@
+from django.contrib import admin
+from .models import *
+
+# Register your models here.
+
+admin.site.register(Product)
+admin.site.register(User)
+
+

+ 6 - 0
mysite/monolit/apps.py

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

+ 9 - 0
mysite/monolit/forms.py

@@ -0,0 +1,9 @@
+from django.contrib.auth.forms import UserCreationForm
+from .models import *
+from django import forms
+
+
+class RegisterForm(UserCreationForm):
+    class Meta:
+        model = User
+        fields = ('username', 'avatar', 'password1', 'password2')

+ 198 - 0
mysite/monolit/migrations/0001_initial.py

@@ -0,0 +1,198 @@
+# Generated by Django 5.0 on 2023-12-26 01:59
+
+import datetime
+import django.contrib.auth.models
+import django.db.models.deletion
+import django.utils.timezone
+from django.conf import settings
+from django.db import migrations, models
+
+
+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",
+                    ),
+                ),
+                (
+                    "title",
+                    models.CharField(max_length=100, verbose_name="Название товара"),
+                ),
+                (
+                    "productImage",
+                    models.ImageField(
+                        upload_to="productImages/", verbose_name="Изображение товара"
+                    ),
+                ),
+                (
+                    "description",
+                    models.TextField(max_length=1000, verbose_name="Описание товара"),
+                ),
+                (
+                    "date_create",
+                    models.DateField(
+                        default=datetime.datetime.now, verbose_name="Дата создания"
+                    ),
+                ),
+                (
+                    "time_create",
+                    models.TimeField(
+                        default=datetime.datetime.now, verbose_name="Время создания"
+                    ),
+                ),
+            ],
+        ),
+        migrations.CreateModel(
+            name="User",
+            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"
+                    ),
+                ),
+                (
+                    "username",
+                    models.CharField(max_length=100, unique=True, verbose_name="Логин"),
+                ),
+                (
+                    "avatar",
+                    models.ImageField(upload_to="avatars/", verbose_name="Аватар"),
+                ),
+                ("userInfo", models.TextField(max_length=1000, 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()),
+            ],
+        ),
+        migrations.CreateModel(
+            name="OrderedProduct",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("order_date", models.DateTimeField(auto_now_add=True)),
+                (
+                    "user",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to=settings.AUTH_USER_MODEL,
+                        verbose_name="Пользователь",
+                    ),
+                ),
+                (
+                    "product",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to="monolit.product",
+                        verbose_name="Заказанный товар",
+                    ),
+                ),
+            ],
+        ),
+    ]

+ 68 - 0
mysite/monolit/migrations/0002_basket_profile_delete_orderedproduct.py

@@ -0,0 +1,68 @@
+# Generated by Django 5.0 on 2023-12-26 02:01
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("monolit", "0001_initial"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="Basket",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("created_time", models.DateTimeField(auto_now_add=True)),
+                ("count", models.PositiveIntegerField(default=0)),
+                (
+                    "product",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to="monolit.product",
+                    ),
+                ),
+                (
+                    "user",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+            ],
+        ),
+        migrations.CreateModel(
+            name="Profile",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "user",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+            ],
+        ),
+        migrations.DeleteModel(
+            name="OrderedProduct",
+        ),
+    ]

+ 16 - 0
mysite/monolit/migrations/0003_remove_user_userinfo.py

@@ -0,0 +1,16 @@
+# Generated by Django 5.0 on 2023-12-26 02:02
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("monolit", "0002_basket_profile_delete_orderedproduct"),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name="user",
+            name="userInfo",
+        ),
+    ]

+ 0 - 0
mysite/monolit/migrations/__init__.py


+ 29 - 0
mysite/monolit/models.py

@@ -0,0 +1,29 @@
+from django.db import models
+from datetime import datetime
+from django.contrib.auth.models import AbstractUser
+
+class User(AbstractUser):
+    username = models.CharField(max_length=100, verbose_name='Логин', unique=True)
+    avatar = models.ImageField(verbose_name='Аватар', upload_to='avatars/', blank=False)
+
+class Product(models.Model):
+    title = models.CharField(max_length=100, verbose_name='Название товара', blank=False)
+    productImage = models.ImageField(verbose_name='Изображение товара', upload_to='productImages/', blank=False)
+    description = models.TextField(max_length=1000, verbose_name='Описание товара', blank=False)
+    date_create = models.DateField(default=datetime.now, verbose_name="Дата создания")
+    time_create = models.TimeField(default=datetime.now, verbose_name="Время создания")
+
+class Profile(models.Model):
+    user = models.ForeignKey(User, on_delete=models.CASCADE)
+
+class Basket(models.Model):
+    user = models.ForeignKey(User, on_delete=models.CASCADE)
+    product = models.ForeignKey(Product, on_delete=models.CASCADE)
+    created_time = models.DateTimeField(auto_now_add=True)
+    count = models.PositiveIntegerField(default=0)
+
+    def __str__(self):
+        return f'Корзина пользователя {self.user.username}  | Продукт {self.product.title}'
+
+
+

+ 3 - 0
mysite/monolit/tests.py

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

+ 18 - 0
mysite/monolit/urls.py

@@ -0,0 +1,18 @@
+from django.conf import settings
+from django.conf.urls.static import static
+from django.urls import path
+from .views import *
+
+urlpatterns = [
+    path('', IndexView.as_view(), name='index'),
+    path('register/', RegisterView.as_view(), name='register'),
+    path('login/', LoginView.as_view(), name='login'),
+    path('logout/', BBLogoutView.as_view(), name='logout'),
+    path('profile/', ProfileBasket.as_view(), name='profile'),
+    path('basket_add/<int:product_id>/', add_to_basket, name='basket_add'),
+    path('service/', ProductsAllView.as_view(), name='all_products'),
+    path('service/<int:pk>', ProductDetail.as_view(), name='product_detail'),
+    path("search_result/", SearchResultsView.as_view(), name="search_results"),
+]
+
+urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 69 - 0
mysite/monolit/views.py

@@ -0,0 +1,69 @@
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.contrib.auth.views import LoginView, LogoutView
+from django.shortcuts import redirect
+from django.urls import reverse_lazy
+from django.views.generic import CreateView, DetailView
+from django.views.generic.list import ListView
+from .forms import *
+from django.db.models import Q
+
+
+class IndexView(ListView):
+    model = Product
+    template_name = 'index.html'
+    context_object_name = 'products'
+    def get_queryset(self):
+        return Product.objects.order_by('-date_create', '-time_create')[:5]
+
+class RegisterView(CreateView):
+    template_name = 'user/register.html'
+    form_class = RegisterForm
+    success_url = reverse_lazy('login')
+
+class LoginView(LoginView):
+    template_name = 'user/login.html'
+    success_url = reverse_lazy('index')
+
+class BBLogoutView(LogoutView):
+    template_name = 'user/logout.html'
+
+
+class ProfileBasket(LoginRequiredMixin, ListView):
+    model = Basket
+    context_object_name = 'baskets'
+    template_name = 'user/profile.html'
+
+def add_to_basket(request, product_id):
+    product = Product.objects.get(id = product_id)
+    baskets = Basket.objects.filter(user=request.user, product=product)
+    if not baskets.exists():
+        Basket.objects.create(user=request.user, product=product, count=1)
+        return redirect('profile')
+    else:
+        basket = baskets.first()
+        basket.count += 1
+        basket.save()
+        return redirect('profile')
+
+class ProductsAllView(ListView):
+    model = Product
+    template_name = 'all_products.html'
+    context_object_name = 'products'
+    def get_queryset(self):
+        return Product.objects.order_by('-date_create', '-time_create')
+
+class ProductDetail(DetailView):
+    model = Product
+    template_name = 'product_detail.html'
+
+
+class SearchResultsView(ListView):
+    model = Product
+    template_name = 'search.html'
+
+    def get_queryset(self):
+        query = self.request.GET.get("q")
+        object_list = Product.objects.filter(
+            Q(title__icontains=query)
+        )
+        return object_list

+ 0 - 0
mysite/mysite/__init__.py


+ 16 - 0
mysite/mysite/asgi.py

@@ -0,0 +1,16 @@
+"""
+ASGI config for mysite 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", "mysite.settings")
+
+application = get_asgi_application()

+ 120 - 0
mysite/mysite/settings.py

@@ -0,0 +1,120 @@
+"""
+Django settings for mysite project.
+
+Generated by 'django-admin startproject' using Django 4.2.5.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.2/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.2/ref/settings/
+"""
+import os
+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/4.2/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-6c6hd2zqye1@a02_b26i79t9n-wt!o(czp81_4!)t=u8&1)ndg'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+    'monolit.apps.MonolitConfig',
+    'django.contrib.admin',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+]
+
+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 = 'mysite.urls'
+
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'DIRS': [os.path.join(BASE_DIR, 'templates')],
+        '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 = 'mysite.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3',
+        'NAME': BASE_DIR / 'db.sqlite3',
+    }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/4.2/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/4.2/howto/static-files/
+
+STATIC_URL = 'static/'
+STATIC_DIR = os.path.join(BASE_DIR, 'static')
+STATICFILES_DIRS = [STATIC_DIR]
+AUTH_USER_MODEL = 'monolit.user'
+MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
+MEDIA_URL = '/media/'
+LOGIN_REDIRECT_URL = '/'
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+

+ 11 - 0
mysite/mysite/urls.py

@@ -0,0 +1,11 @@
+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('monolit.urls')),
+]
+if settings.DEBUG:
+    urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

+ 16 - 0
mysite/mysite/wsgi.py

@@ -0,0 +1,16 @@
+"""
+WSGI config for mysite 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", "mysite.settings")
+
+application = get_wsgi_application()

+ 66 - 0
mysite/static/css/style.css

@@ -0,0 +1,66 @@
+.main{
+    display: flex;
+    flex-direction: row;
+    padding: 30px 0 0 0 ;
+    gap: 30px;
+}
+
+.product{
+    margin-top: 30px;
+    width: 600px;
+    border: 1px solid gray;
+    border-radius: 15px;
+    padding: 25px;
+}
+
+.product_text{
+    white-space:pre-wrap;
+    overflow-wrap: break-word;
+}
+
+.register_form{
+    margin: 30px;
+}
+
+.logout{
+    display: flex;
+    flex-direction: column;
+    margin: 50px;
+    gap: 15px;
+}
+
+.login{
+    margin: 25px 0 0 30px;
+}
+
+.profile{
+    margin: 30px;
+    display: flex;
+    flex-direction: column;
+    gap: 20px;
+}
+
+.user{
+    display: flex;
+    flex-direction: column;
+    gap: 15px;
+    margin-bottom: 15px;
+    align-items: center;
+}
+
+.basket{
+    width: 600px;
+    border: 1px solid gray;
+    border-radius: 15px;
+    padding: 25px;
+}
+
+.products_container{
+    display: flex;
+    flex-direction: column;
+    gap: 15px;
+}
+
+.search_form{
+    margin-top: 25px;
+}

+ 77 - 0
mysite/templates/all_products.html

@@ -0,0 +1,77 @@
+{%load static%}
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
+          integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
+    <link rel="stylesheet" href="{% static 'css/style.css' %}" type="text/css" media="all">
+
+</head>
+<body>
+<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+    <a class="navbar-brand" href="{% url 'index' %}">Интернет-магазин ****</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"
+            aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+
+    <div class="collapse navbar-collapse" id="navbarTogglerDemo02">
+        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
+            <li class="nav-item active">
+                <a class="nav-link" href="{% url 'index' %}">Главная</a>
+            </li>
+            {% if user.is_authenticated %}
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'all_products' %}">Услуги/товары</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 'all_products' %}">Услуги/товары</a>
+            </li>
+            <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>
+    </div>
+</nav>
+
+<div class="main">
+    <div class="pages">
+        {% if user.is_authenticated %}
+        <a class="nav-link" href="{% url 'profile' %}">Профиль</a>
+        {% endif %}
+    </div>
+
+    <div class="products_container">
+        <h1>Все товары/услуги</h1>
+
+        <form class="search_form" action="{% url 'search_results' %}" method="get">
+          <input name="q" type="text" placeholder="Поиск товара(Название)">
+        </form>
+
+        {% if products %}
+        {% for i in products %}
+        <div class="product">
+            <p class="product_text"><b>Название: </b><a href="{% url 'product_detail' i.id %}">{{i.title}}</a> </p>
+            <img src="{{i.productImage.url}}" width="200px" height="200px"/>
+            <p class="product_text"><b>Описание: </b>{{i.description}} </p>
+        </div>
+        {% endfor %}
+        {% else %}
+        <p>тут ничего нет</p>
+        {% endif %}
+    </div>
+
+
+</div>
+</body>
+</html>

+ 80 - 0
mysite/templates/index.html

@@ -0,0 +1,80 @@
+{%load static%}
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
+          integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
+    <link rel="stylesheet" href="{% static 'css/style.css' %}" type="text/css" media="all">
+
+</head>
+<body>
+<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+    <a class="navbar-brand" href="{% url 'index' %}">Интернет-магазин ****</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"
+            aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+
+    <div class="collapse navbar-collapse" id="navbarTogglerDemo02">
+        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
+            <li class="nav-item active">
+                <a class="nav-link" href="{% url 'index' %}">Главная</a>
+            </li>
+            {% if user.is_authenticated %}
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'all_products' %}">Услуги/товары</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 'all_products' %}">Услуги/товары</a>
+            </li>
+            <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>
+    </div>
+</nav>
+
+<div class="main">
+    <div class="pages">
+        {% if user.is_authenticated %}
+
+        <a class="nav-link" href="{% url 'profile' %}">Профиль</a>
+
+        {% endif %}
+    </div>
+
+    <div>
+        <h1>мы такая-то фирма, представляем такие-то товары</h1>
+        <h3>последние товары</h3>
+
+        <form class="search_form" action="{% url 'search_results' %}" method="get">
+          <input name="q" type="text" placeholder="Поиск товара(Название)">
+        </form>
+
+        {% if products %}
+        {% for i in products %}
+        <div class="product">
+            <p class="product_text"><b>Название: </b><a href="{% url 'product_detail' i.id %}">{{i.title}}</a> </p>
+            <img src="{{i.productImage.url}}" width="200px" height="200px"/>
+            <p class="product_text"><b>Описание: </b>{{i.description}} </p>
+
+        </div>
+        {% endfor %}
+        {% else %}
+        <p>тут ничего нет</p>
+        {% endif %}
+    </div>
+
+</div>
+</body>
+</html>

+ 70 - 0
mysite/templates/product_detail.html

@@ -0,0 +1,70 @@
+{%load static%}
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
+          integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
+    <link rel="stylesheet" href="{% static 'css/style.css' %}" type="text/css" media="all">
+
+</head>
+<body>
+<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+    <a class="navbar-brand" href="{% url 'index' %}">Интернет-магазин ****</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"
+            aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+
+    <div class="collapse navbar-collapse" id="navbarTogglerDemo02">
+        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
+            <li class="nav-item active">
+                <a class="nav-link" href="{% url 'index' %}">Главная</a>
+            </li>
+            {% if user.is_authenticated %}
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'all_products' %}">Услуги/товары</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 'all_products' %}">Услуги/товары</a>
+            </li>
+            <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>
+    </div>
+</nav>
+
+<div class="main">
+    <div class="pages">
+        {% if user.is_authenticated %}
+        <a class="nav-link" href="{% url 'profile' %}">Профиль</a>
+        {% endif %}
+    </div>
+
+
+    <div class="product">
+        <p class="product_text"><b>Название: </b>{{product.title}}</p>
+        <img src="{{product.productImage.url}}" width="200px" height="200px"/>
+        <p class="product_text"><b>Описание: </b>{{product.description}} </p>
+        {% if user.is_authenticated %}
+        <a href="{% url 'basket_add' product.id %}">
+            <button type="button" class="btn btn-outline-success">Заказать</button>
+        </a>
+        {% endif %}
+    </div>
+
+
+
+</div>
+</body>
+</html>

+ 75 - 0
mysite/templates/search.html

@@ -0,0 +1,75 @@
+{%load static%}
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
+          integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
+    <link rel="stylesheet" href="{% static 'css/style.css' %}" type="text/css" media="all">
+
+</head>
+<body>
+<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+    <a class="navbar-brand" href="{% url 'index' %}">Интернет-магазин ****</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"
+            aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+
+    <div class="collapse navbar-collapse" id="navbarTogglerDemo02">
+        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
+            <li class="nav-item active">
+                <a class="nav-link" href="{% url 'index' %}">Главная</a>
+            </li>
+            {% if user.is_authenticated %}
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'all_products' %}">Услуги/товары</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 'all_products' %}">Услуги/товары</a>
+            </li>
+            <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 class="form-inline my-2 my-lg-0">
+            <input class="form-control mr-sm-2" type="search" placeholder="Поиск">
+            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Найти</button>
+        </form>
+    </div>
+</nav>
+
+<div class="main">
+    <div class="pages">
+        {% if user.is_authenticated %}
+        <a class="nav-link" href="{% url 'profile' %}">Профиль</a>
+        {% endif %}
+    </div>
+
+    <div>
+        <h1>Найденные результаты</h1>
+
+        {% if object_list %}
+        {% for i in object_list %}
+
+        <p class="product_text"><b>Название: </b><a href="{% url 'product_detail' i.id %}">{{i.title}}</a></p>
+
+        {% endfor %}
+        {% else %}
+        <p>Такого товара/услуги нет на сайте</p>
+        {% endif %}
+    </div>
+
+
+</div>
+</body>
+</html>

+ 47 - 0
mysite/templates/user/login.html

@@ -0,0 +1,47 @@
+{%load static%}
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
+          integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
+    <link rel="stylesheet" href="{% static 'css/style.css' %}" type="text/css" media="all">
+
+</head>
+<body>
+<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+    <a class="navbar-brand" href="{% url 'index' %}">Интернет-магазин ****</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"
+            aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+
+    <div class="collapse navbar-collapse" id="navbarTogglerDemo02">
+        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
+            <li class="nav-item active">
+                <a class="nav-link" href="{% url 'index' %}">Главная</a>
+            </li>
+        </ul>
+    </div>
+</nav>
+
+<div class="main">
+    <form class="login" method="post">
+        {% csrf_token %}
+        <table>
+            <tr>
+                <td>{{ form.username.label_tag }}</td>
+                <td>{{ form.username }}</td>
+            </tr>
+            <tr>
+                <td>{{ form.password.label_tag }}</td>
+                <td>{{ form.password }}</td>
+            </tr>
+        </table>
+        <input type="submit" value="Войти"/>
+    </form>
+
+</div>
+
+</body>
+</html>

+ 28 - 0
mysite/templates/user/logout.html

@@ -0,0 +1,28 @@
+{%load static%}
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
+          integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
+    <link rel="stylesheet" href="{% static 'css/style.css' %}" type="text/css" media="all">
+
+</head>
+<body>
+<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+    <a class="navbar-brand" href="{% url 'index' %}">Интернет-магазин ****</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"
+            aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+
+</nav>
+
+<div class="logout">
+    <h3>Вы успешно вышли с сайта</h3>
+    <a href="{% url 'index' %}">Вернуться на главную</a>
+
+</div>
+
+</body>
+</html>

+ 57 - 0
mysite/templates/user/profile.html

@@ -0,0 +1,57 @@
+{%load static%}
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
+          integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
+    <link rel="stylesheet" href="{% static 'css/style.css' %}" type="text/css" media="all">
+
+</head>
+<body>
+<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+    <a class="navbar-brand" href="{% url 'index' %}">Интернет-магазин ****</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"
+            aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+
+    <div class="collapse navbar-collapse" id="navbarTogglerDemo02">
+        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
+            <li class="nav-item active">
+                <a class="nav-link" href="{% url 'index' %}">Главная</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'all_products' %}">Услуги/товары</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" href="{% url 'logout' %}">Выход</a>
+            </li>
+        </ul>
+    </div>
+</nav>
+
+<div class="profile">
+    <div class="user">
+        <h3>Профиль пользователя {{ user.username }}</h3>
+        <img src="{{ user.avatar.url }}" alt="аватар" width="150px">
+    </div>
+
+    <h3>Заказанные товары</h3>
+
+    {% if baskets %}
+    {% for basket in baskets %}
+    <div class="basket">
+        <p class="product_text"><b>Название: </b><a href="{% url 'product_detail' basket.product.id %}">{{basket.product.title}}</a></p>
+        <img src="{{ basket.product.productImage.url }}" width="150px" height="150px">
+        <p>Количество товаров: {{ basket.count }}</p>
+        <p>Дата добавления: {{ basket.created_time }}</p>
+    </div>
+    {% endfor %}
+    {% else %}
+    <p>корзинка пуста</p>
+    {% endif %}
+
+</div>
+</body>
+</html>

+ 38 - 0
mysite/templates/user/register.html

@@ -0,0 +1,38 @@
+{%load static%}
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
+          integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
+    <link rel="stylesheet" href="{% static 'css/style.css' %}" type="text/css" media="all">
+
+</head>
+<body>
+<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
+    <a class="navbar-brand" href="{% url 'index' %}">Интернет-магазин ****</a>
+    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02"
+            aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
+        <span class="navbar-toggler-icon"></span>
+    </button>
+
+    <div class="collapse navbar-collapse" id="navbarTogglerDemo02">
+        <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
+            <li class="nav-item active">
+                <a class="nav-link" href="{% url 'index' %}">Главная</a>
+            </li>
+        </ul>
+    </div>
+</nav>
+
+<div class="main">
+    <form class="register_form" method="post" enctype="multipart/form-data">
+        {% csrf_token %}
+        {{ form.as_p}}
+        <input type="submit" value="Зарегистрироваться"/>
+    </form>
+
+</div>
+
+</body>
+</html>