Упрощена модель Shop и реализован полный CRUD для магазинов

- Упрощена модель Shop: только name обязательное поле
- Удалены поля: district, режим работы, координаты, инструкции
- Description перенесено после name
- Все поля кроме name теперь опциональные

- Создан полный CRUD для магазинов:
  * ShopListView - список магазинов с пагинацией
  * ShopCreateView - создание нового магазина
  * ShopUpdateView - редактирование магазина
  * ShopDeleteView - удаление с подтверждением

- Создана форма ShopForm с Bootstrap стилями
- Поле "Название магазина" помечено как обязательное (*)
- Настроена обработка PhoneNumberField

- Созданы шаблоны:
  * shop_list.html - таблица со списком магазинов
  * shop_form.html - форма создания/редактирования
  * shop_confirm_delete.html - подтверждение удаления

- Настроены URLs для приложения shops
- Добавлена ссылка "Магазины" в главную навигацию
- Обновлена админ-панель shops

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-12 00:10:34 +03:00
parent 7858c780d1
commit a1f5733fde
11 changed files with 477 additions and 80 deletions

View File

@@ -1,3 +1,52 @@
from django.shortcuts import render
from django.urls import reverse_lazy
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from .models import Shop
from .forms import ShopForm
# Create your views here.
class ShopListView(ListView):
"""Список всех магазинов"""
model = Shop
template_name = 'shops/shop_list.html'
context_object_name = 'shops'
paginate_by = 20
def get_queryset(self):
"""Показываем только активные магазины по умолчанию"""
queryset = super().get_queryset()
return queryset.filter(is_active=True)
class ShopCreateView(CreateView):
"""Создание нового магазина"""
model = Shop
form_class = ShopForm
template_name = 'shops/shop_form.html'
success_url = reverse_lazy('shops:shop_list')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = 'Создать магазин'
context['button_text'] = 'Создать'
return context
class ShopUpdateView(UpdateView):
"""Редактирование магазина"""
model = Shop
form_class = ShopForm
template_name = 'shops/shop_form.html'
success_url = reverse_lazy('shops:shop_list')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = f'Редактировать: {self.object.name}'
context['button_text'] = 'Сохранить'
return context
class ShopDeleteView(DeleteView):
"""Удаление магазина"""
model = Shop
template_name = 'shops/shop_confirm_delete.html'
success_url = reverse_lazy('shops:shop_list')