Добавил предварительный просмотр для статей и продуктов

This commit is contained in:
NikDizell 2026-06-19 22:48:25 +03:00
parent 5a9c0bbcc6
commit e9bd2b912d
4 changed files with 23 additions and 1 deletions

View File

@ -152,6 +152,8 @@ class ArticleDraftPreviewView(MenuContextMixin, BreadcrumbMixin, DetailView):
model = Article model = Article
template_name = 'blog/article_detail.html' # используем тот же шаблон template_name = 'blog/article_detail.html' # используем тот же шаблон
context_object_name = 'article' context_object_name = 'article'
slug_field = 'slug'
slug_url_kwarg = 'slug'
def get_queryset(self): def get_queryset(self):
# Для предпросмотра показываем даже неопубликованные статьи # Для предпросмотра показываем даже неопубликованные статьи

View File

@ -4,6 +4,7 @@ from django.shortcuts import render
from django_ckeditor_5.widgets import CKEditor5Widget from django_ckeditor_5.widgets import CKEditor5Widget
from .models import ProductCategory, Configuration, Product, Order from .models import ProductCategory, Configuration, Product, Order
from programmer.utils.email_notifications import send_multiple_order_notifications, send_multiple_order_notifications_async from programmer.utils.email_notifications import send_multiple_order_notifications, send_multiple_order_notifications_async
from django.urls import reverse
@admin.register(ProductCategory) @admin.register(ProductCategory)
@ -57,6 +58,12 @@ class ProductAdmin(admin.ModelAdmin):
return ", ".join(c.name for c in obj.configurations.all()) return ", ".join(c.name for c in obj.configurations.all())
configurations_list.short_description = "Конфигурации" 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): def make_published(self, request, queryset):
queryset.update(is_published=True) queryset.update(is_published=True)
make_published.short_description = "Опубликовать выбранные продукты" make_published.short_description = "Опубликовать выбранные продукты"

View File

@ -7,4 +7,5 @@ urlpatterns = [
path('', views.ProductListView.as_view(), name='product_list'), path('', views.ProductListView.as_view(), name='product_list'),
path('<slug:slug>/', views.ProductDetailView.as_view(), name='product_detail'), path('<slug:slug>/', views.ProductDetailView.as_view(), name='product_detail'),
path('order/<slug:slug>/', views.order_create, name='order_create'), path('order/<slug:slug>/', views.order_create, name='order_create'),
path('draft/<slug:slug>/', views.ProductDraftPreviewView.as_view(), name='product_draft_preview'),
] ]

View File

@ -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 programmer.mixins import MenuContextMixin, BreadcrumbMixin
from .models import Product, ProductCategory, Configuration from .models import Product, ProductCategory, Configuration
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
@ -8,6 +8,8 @@ from .forms import OrderForm
from django.contrib import messages from django.contrib import messages
from django.shortcuts import redirect from django.shortcuts import redirect
from programmer.utils.email_notifications import send_order_notification, send_order_notification_async 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): class ProductListView(MenuContextMixin, BreadcrumbMixin, ListView):
@ -132,6 +134,16 @@ class ProductDetailView(MenuContextMixin, BreadcrumbMixin, DetailView):
return context 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): def order_create(request, slug):
product = get_object_or_404(Product, slug=slug, is_published=True) product = get_object_or_404(Product, slug=slug, is_published=True)