From e9bd2b912dae5bffb02f789e46297a3734e170dc Mon Sep 17 00:00:00 2001 From: NikDizell Date: Fri, 19 Jun 2026 22:48:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D0=B2=D0=B0=D1=80=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC?= =?UTF-8?q?=D0=BE=D1=82=D1=80=20=D0=B4=D0=BB=D1=8F=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=B9=20=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B4=D1=83?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blog/views.py | 2 ++ products/admin.py | 7 +++++++ products/urls.py | 1 + products/views.py | 14 +++++++++++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/blog/views.py b/blog/views.py index 57eec23..e4363d7 100644 --- a/blog/views.py +++ b/blog/views.py @@ -152,6 +152,8 @@ class ArticleDraftPreviewView(MenuContextMixin, BreadcrumbMixin, DetailView): model = Article template_name = 'blog/article_detail.html' # используем тот же шаблон context_object_name = 'article' + slug_field = 'slug' + slug_url_kwarg = 'slug' def get_queryset(self): # Для предпросмотра показываем даже неопубликованные статьи diff --git a/products/admin.py b/products/admin.py index 1b3ce9f..065db27 100644 --- a/products/admin.py +++ b/products/admin.py @@ -4,6 +4,7 @@ from django.shortcuts import render from django_ckeditor_5.widgets import CKEditor5Widget from .models import ProductCategory, Configuration, Product, Order from programmer.utils.email_notifications import send_multiple_order_notifications, send_multiple_order_notifications_async +from django.urls import reverse @admin.register(ProductCategory) @@ -57,6 +58,12 @@ class ProductAdmin(admin.ModelAdmin): return ", ".join(c.name for c in obj.configurations.all()) configurations_list.short_description = "Конфигурации" + def view_on_site(self, obj): + if obj.is_published: + return obj.get_absolute_url() + # Для неопубликованных — ссылка на предпросмотр + return reverse('products:product_draft_preview', args=[obj.slug]) + def make_published(self, request, queryset): queryset.update(is_published=True) make_published.short_description = "Опубликовать выбранные продукты" diff --git a/products/urls.py b/products/urls.py index 9cf2994..21fc691 100644 --- a/products/urls.py +++ b/products/urls.py @@ -7,4 +7,5 @@ urlpatterns = [ path('', views.ProductListView.as_view(), name='product_list'), path('/', views.ProductDetailView.as_view(), name='product_detail'), path('order//', views.order_create, name='order_create'), + path('draft//', views.ProductDraftPreviewView.as_view(), name='product_draft_preview'), ] \ No newline at end of file diff --git a/products/views.py b/products/views.py index 1778c85..29f60ca 100644 --- a/products/views.py +++ b/products/views.py @@ -1,4 +1,4 @@ -from django.views.generic import ListView, DetailView +from django.views.generic import ListView, DetailView, DetailView from programmer.mixins import MenuContextMixin, BreadcrumbMixin from .models import Product, ProductCategory, Configuration from django.shortcuts import get_object_or_404 @@ -8,6 +8,8 @@ from .forms import OrderForm from django.contrib import messages from django.shortcuts import redirect from programmer.utils.email_notifications import send_order_notification, send_order_notification_async +from django.utils.decorators import method_decorator +from django.contrib.admin.views.decorators import staff_member_required class ProductListView(MenuContextMixin, BreadcrumbMixin, ListView): @@ -132,6 +134,16 @@ class ProductDetailView(MenuContextMixin, BreadcrumbMixin, DetailView): return context +@method_decorator(staff_member_required, name='dispatch') +class ProductDraftPreviewView(DetailView): + model = Product + template_name = 'products/product_detail.html' + context_object_name = 'product' + + def get_queryset(self): + # Показываем все продукты (включая неопубликованные) только для персонала + return Product.objects.all() + def order_create(request, slug): product = get_object_or_404(Product, slug=slug, is_published=True)