feat: создать базовый шаблон и структуру для страницы каталога
All checks were successful
Build and Push Docker Image / build (push) Successful in 26s
All checks were successful
Build and Push Docker Image / build (push) Successful in 26s
- Создан шаблон `catalog/index.html` с поддержкой хлебных крошек и активного раздела - Добавлены модели `Category` и `Item` с настройкой админ-панели - Реализован обработчик URL для отображения категорий и страницы каталога - Добавлены стили `catalog.css` и `error.css` для новых элементов - Переведён проект в production режим (DEBUG=False)
This commit is contained in:
@@ -1,3 +1,16 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
from .models import Category, Item
|
||||
|
||||
|
||||
@admin.register(Category)
|
||||
class CategoryAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'slug')
|
||||
prepopulated_fields = {'slug': ('name',)}
|
||||
|
||||
|
||||
@admin.register(Item)
|
||||
class ItemAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'category', 'price', 'is_available', 'created_at')
|
||||
list_filter = ('is_available', 'category', 'created_at')
|
||||
prepopulated_fields = {'slug': ('name',)}
|
||||
|
||||
@@ -1,3 +1,31 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class Category(models.Model):
|
||||
name = models.CharField(max_length=255, verbose_name='Название')
|
||||
slug = models.SlugField(unique=True, verbose_name='URL')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Категория'
|
||||
verbose_name_plural = 'Категории'
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Item(models.Model):
|
||||
name = models.CharField(max_length=255, verbose_name='Название')
|
||||
slug = models.SlugField(unique=True, verbose_name='URL')
|
||||
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='items', verbose_name='Категория')
|
||||
description = models.TextField(blank=True, verbose_name='Описание')
|
||||
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Цена')
|
||||
is_available = models.BooleanField(default=True, verbose_name='В наличии')
|
||||
created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')
|
||||
updated_at = models.DateTimeField(auto_now=True, verbose_name='Дата обновления')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Товар'
|
||||
verbose_name_plural = 'Товары'
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
from django.urls import path
|
||||
|
||||
from . import views
|
||||
|
||||
urlpatterns = []
|
||||
urlpatterns = [
|
||||
path('', views.index),
|
||||
path('<str:category>/', views.index)
|
||||
]
|
||||
@@ -1,3 +1,29 @@
|
||||
from django.shortcuts import render
|
||||
from dataclasses import dataclass
|
||||
|
||||
from django.http import HttpRequest, HttpResponse, Http404
|
||||
from django.shortcuts import render, redirect
|
||||
|
||||
from items.models import Category
|
||||
|
||||
|
||||
# Create your views here.
|
||||
|
||||
@dataclass
|
||||
class SelectedCategory:
|
||||
name: str | None
|
||||
id: str | None
|
||||
|
||||
|
||||
def index(request: HttpRequest, category: str | None = None) -> HttpResponse:
|
||||
selected_category = SelectedCategory(name=None, id=None)
|
||||
if category is not None:
|
||||
try:
|
||||
cat = Category.objects.get(slug=category.lower())
|
||||
selected_category = SelectedCategory(name=cat.name, id=cat.slug)
|
||||
except Category.DoesNotExist:
|
||||
raise Http404()
|
||||
|
||||
return render(request, 'catalog/index.html', {
|
||||
'categories': Category.objects.all(),
|
||||
'selected_category': selected_category
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user