diff options
| author | spl3g <spleefer6@gmail.com> | 2026-06-01 17:38:35 +0300 |
|---|---|---|
| committer | spl3g <spleefer6@gmail.com> | 2026-06-01 21:22:49 +0300 |
| commit | 386e9defbea931ebc5139a5db5c74e6f44bbbe02 (patch) | |
| tree | 9dff93fbd1c680790c11dbb80a231f50a004bc19 /core | |
| parent | 611f3017c00dd9a220402489602defab66f2c9f0 (diff) | |
add product creation page and search filters
Diffstat (limited to 'core')
| -rw-r--r-- | core/templates/core/login.html | 2 | ||||
| -rw-r--r-- | core/templates/core/product_form.html | 15 | ||||
| -rw-r--r-- | core/templates/core/product_list.html | 42 | ||||
| -rw-r--r-- | core/views.py | 65 |
4 files changed, 122 insertions, 2 deletions
diff --git a/core/templates/core/login.html b/core/templates/core/login.html index c17f521..098a9fd 100644 --- a/core/templates/core/login.html +++ b/core/templates/core/login.html @@ -27,5 +27,7 @@ <input type="password" name="password"> <button type="submit" class="btn">Войти</button> </form> + + <a href="{% url 'product_list' %}">Войти как гость</a> </div> {% endblock %} diff --git a/core/templates/core/product_form.html b/core/templates/core/product_form.html new file mode 100644 index 0000000..81a7075 --- /dev/null +++ b/core/templates/core/product_form.html @@ -0,0 +1,15 @@ +{% extends 'core/base.html' %} + +{% block title %}{% if is_edit %}Редактирование{% else %}Добавление{% endif %} товара - ОООБувь{% endblock %} + +{% block h1 %}{% if is_edit %}Редактирование{% else %}Добавление{% endif %} товара{% endblock %} + +{% block content %} +<div> + <form method="post" enctype="multipart/form-data"> + {% csrf_token %} + {{ form }} + <button type="submit" class="btn">Сохранить</button> + </form> +</div> +{% endblock %} diff --git a/core/templates/core/product_list.html b/core/templates/core/product_list.html index ac4b8c7..ad7a5bf 100644 --- a/core/templates/core/product_list.html +++ b/core/templates/core/product_list.html @@ -5,6 +5,48 @@ {% block h1 %}Каталог товаров{% endblock %} {% block content %} +{% if user.role.name == "Администратор" or user.role.name == "Менеджер" %} +<div> + <form method="get" style="display: flex;"> + <div> + <label>Поиск:</label><br/> + <input type="text" name="search" value="{{ current_search }}" placeholder="Найти..." oninput="clearTimeout(this.delay); this.delay = setTimeout(() => this.form.submit(), 500);"> + </div> + + <div> + <label>Поставщик:</label><br/> + <select name="supplier" onchange="this.form.submit()"> + <option value="all">Все поставщики</option> + {% for supplier in suppliers %} + supplier.id|stringformat:"i" + <option value="{{ supplier.id }}" {% if current_supplier == supplier.id|stringformat:"i" %}selected{% endif %}>{{ supplier.name }}</option> + {% endfor %} + </select> + </div> + + <div> + <label>Сортировка:</label><br/> + <select name="sort" onchange="this.form.submit()"> + <option value="">Без сортировки</option> + <option value="asc" {% if current_sort == "asc" %}selected{% endif %}>По возрастанию</option> + <option value="desc" {% if current_sort == "desc" %}selected{% endif %}>По убыванию</option> + </select> + </div> + + {% comment %} + <div style="margin-left: 10px;"> + <a href="{% url 'order_list' %}" class="btn" style="background-color: #5bc0de;">Заказы</a> + </div> + {% endcomment %} + + {% if user.role.name == 'Администратор' %} + <div style="margin-left: auto;"> + <a href="{% url 'product_create' %}" class="btn">Добавить товар</a> + </div> + {% endif %} + </form> +</div> +{% endif %} <div> {% for product in products %} <div class="product-card diff --git a/core/views.py b/core/views.py index 6957abc..f090d81 100644 --- a/core/views.py +++ b/core/views.py @@ -1,8 +1,15 @@ +from typing import Any + from django.shortcuts import render -from django.views.generic import ListView +from django.views.generic import ListView, CreateView, UpdateView +from django.urls import reverse_lazy from django.contrib.auth.views import LoginView +from django.contrib import messages +from django.db.models import Q +from django.contrib.auth.mixins import UserPassesTestMixin -from .models import Product +from .models import Product, Supplier +from .forms import ProductForm class UserLoginView(LoginView): template_name = "core/login.html" @@ -11,3 +18,57 @@ class ProductListView(ListView): model = Product template_name = "core/product_list.html" context_object_name = "products" + + def get_queryset(self): + queryset = Product.objects.all().select_related("supplier") + search_query = self.request.GET.get("search", "") + if search_query: + queryset = queryset.filter( + Q(name__icontains=search_query) + | Q(description__icontains=search_query) + | Q(manufacturer__icontains=search_query) + | Q(category__icontains=search_query) + ) + supplier_id = self.request.GET.get("supplier", "") + if supplier_id and supplier_id != 'all': + queryset = queryset.filter(supplier_id=supplier_id) + sort = self.request.GET.get("sort") + if sort == "asc": + queryset = queryset.order_by("quantity") + if sort == "desc": + queryset = queryset.order_by("-quantity") + return queryset + + def get_context_data(self, **kwargs) -> dict[str, Any]: + context = super().get_context_data(**kwargs) + context["suppliers"] = Supplier.objects.all() + context["current_supplier"] = self.request.GET.get("supplier", "") + context["current_search"] = self.request.GET.get("search", "") + context["current_sort"] = self.request.GET.get("sort", "") + + return context + + +class AdminRequiredMixin(UserPassesTestMixin): + def test_func(self): + return ( + self.request.user.is_authenticated + and self.request.user.role + and self.request.user.role == "Администратор" + ) + +class ProductCreateUpdateMixin: + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["all_suppliers"] = Supplier.objects.all() + return context + +class ProductCreateView(AdminRequiredMixin, ProductCreateUpdateMixin, CreateView): + model = Product + form_class = ProductForm + template_name = "core/product_form.html" + success_url = reverse_lazy("product_list") + + def form_valid(self, form): + messages.success(self.request, "Товар успешно добавлен") + return super().form_valid(form) |
