feat(products): добавить интерфейс маркетинговых флагов

Добавлены поля is_new, is_popular, is_special в форму продукта.
Настроено отображение полей в виде переключателей (switch).
Добавлено отображение бейджей флагов в списке товаров
и на странице детализации продукта.
This commit is contained in:
2026-01-13 10:04:48 +03:00
parent ec9fd1c78b
commit 2aa3de7bfa
4 changed files with 68 additions and 1 deletions

View File

@@ -98,7 +98,8 @@ class ProductForm(SKUUniqueMixin, forms.ModelForm):
model = Product model = Product
fields = [ fields = [
'name', 'sku', 'description', 'short_description', 'categories', 'name', 'sku', 'description', 'short_description', 'categories',
'tags', 'base_unit', 'price', 'sale_price', 'status' 'tags', 'base_unit', 'price', 'sale_price', 'status',
'is_new', 'is_popular', 'is_special'
] ]
labels = { labels = {
'name': 'Название', 'name': 'Название',
@@ -149,6 +150,13 @@ class ProductForm(SKUUniqueMixin, forms.ModelForm):
self.fields['base_unit'].required = False self.fields['base_unit'].required = False
self.fields['base_unit'].help_text = 'Базовая единица для учета товара на складе. На основе этой единицы можно создать единицы продажи.' self.fields['base_unit'].help_text = 'Базовая единица для учета товара на складе. На основе этой единицы можно создать единицы продажи.'
# Маркетинговые флаги (switch-стиль)
for flag_field in ['is_new', 'is_popular', 'is_special']:
self.fields[flag_field].widget.attrs.update({
'class': 'form-check-input',
'role': 'switch'
})
def clean_name(self): def clean_name(self):
"""Валидация уникальности имени для активных товаров""" """Валидация уникальности имени для активных товаров"""
name = self.cleaned_data.get('name') name = self.cleaned_data.get('name')

View File

@@ -338,6 +338,23 @@
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr>
<th>Маркетинговые флаги:</th>
<td>
{% if product.is_new %}
<span class="badge bg-warning text-dark"><i class="bi bi-stars"></i> Новинка</span>
{% endif %}
{% if product.is_popular %}
<span class="badge bg-danger"><i class="bi bi-fire"></i> Популярный</span>
{% endif %}
{% if product.is_special %}
<span class="badge bg-success"><i class="bi bi-percent"></i> Спецпредложение</span>
{% endif %}
{% if not product.is_new and not product.is_popular and not product.is_special %}
<span class="text-muted">-</span>
{% endif %}
</td>
</tr>
<tr> <tr>
<th>Дата создания:</th> <th>Дата создания:</th>
<td>{{ product.created_at }}</td> <td>{{ product.created_at }}</td>

View File

@@ -530,6 +530,43 @@
<hr class="my-4"> <hr class="my-4">
<!-- Блок: Маркетинговые флаги -->
<div class="mb-4">
<h5 class="mb-3"><i class="bi bi-tag"></i> Маркетинговые флаги</h5>
<p class="text-muted small mb-3">Отображаются на внешних площадках (Recommerce и др.)</p>
<div class="row">
<div class="col-md-4">
<div class="form-check form-switch">
{{ form.is_new }}
<label class="form-check-label" for="id_is_new">
<i class="bi bi-stars text-warning"></i> Новинка
</label>
</div>
<small class="text-muted d-block ms-4">Товар отображается как новый</small>
</div>
<div class="col-md-4">
<div class="form-check form-switch">
{{ form.is_popular }}
<label class="form-check-label" for="id_is_popular">
<i class="bi bi-fire text-danger"></i> Популярный
</label>
</div>
<small class="text-muted d-block ms-4">Товар отображается как популярный</small>
</div>
<div class="col-md-4">
<div class="form-check form-switch">
{{ form.is_special }}
<label class="form-check-label" for="id_is_special">
<i class="bi bi-percent text-success"></i> Спецпредложение
</label>
</div>
<small class="text-muted d-block ms-4">Акционный товар (+ автоматически при скидке)</small>
</div>
</div>
</div>
<hr class="my-4">
<!-- Блок 2.5: Информация о наличии (только при редактировании) --> <!-- Блок 2.5: Информация о наличии (только при редактировании) -->
{% if object %} {% if object %}
<div class="mb-4 p-3 bg-info-light rounded border border-info"> <div class="mb-4 p-3 bg-info-light rounded border border-info">

View File

@@ -246,6 +246,11 @@
{% else %} {% else %}
<a href="{% url 'products:productkit-detail' item.pk %}">{{ item.name }}</a> <a href="{% url 'products:productkit-detail' item.pk %}">{{ item.name }}</a>
{% endif %} {% endif %}
<div class="mt-1">
{% if item.is_new %}<span class="badge bg-warning text-dark" title="Новинка"><i class="bi bi-stars"></i></span>{% endif %}
{% if item.is_popular %}<span class="badge bg-danger" title="Популярный"><i class="bi bi-fire"></i></span>{% endif %}
{% if item.is_special %}<span class="badge bg-success" title="Спецпредложение"><i class="bi bi-percent"></i></span>{% endif %}
</div>
</td> </td>
<td><code class="small">{{ item.sku }}</code></td> <td><code class="small">{{ item.sku }}</code></td>
<td> <td>