diff --git a/smartsoltech/web/admin.py b/smartsoltech/web/admin.py index a4ad17c..2b948c4 100644 --- a/smartsoltech/web/admin.py +++ b/smartsoltech/web/admin.py @@ -3,7 +3,7 @@ from .models import ( Service, Project, Client, Order, Review, BlogPost, Category, ServiceRequest, AboutPage, FooterSettings, TeamMember, PortfolioItem, PrivacyPolicy, TermsOfUse, NewsArticle, CareerVacancy, - SiteSettings + SiteSettings, PortfolioImage ) from .forms import ProjectForm @@ -49,12 +49,25 @@ class CategoryAdmin(admin.ModelAdmin): search_fields = ('name',) +class PortfolioImageInline(admin.TabularInline): + model = PortfolioImage + extra = 3 + fields = ('image', 'caption', 'order') + verbose_name = 'Дополнительное изображение' + verbose_name_plural = 'Галерея изображений' + + @admin.register(PortfolioItem) class PortfolioItemAdmin(admin.ModelAdmin): - list_display = ('title', 'client_name', 'completion_date', 'featured', 'is_active') - list_filter = ('featured', 'is_active', 'completion_date') - search_fields = ('title', 'client_name') + list_display = ('title', 'client_name', 'completion_date', 'featured', 'is_active', 'gallery_count') + list_filter = ('featured', 'is_active', 'completion_date', 'category') + search_fields = ('title', 'client_name', 'description') prepopulated_fields = {'slug': ('title',)} + inlines = [PortfolioImageInline] + + def gallery_count(self, obj): + return obj.gallery_images.count() + gallery_count.short_description = 'Фото в галерее' # type: ignore @admin.register(NewsArticle) diff --git a/smartsoltech/web/models.py b/smartsoltech/web/models.py index f55c88f..02cfbb9 100644 --- a/smartsoltech/web/models.py +++ b/smartsoltech/web/models.py @@ -172,7 +172,7 @@ class PortfolioItem(models.Model): description = models.TextField() client_name = models.CharField(max_length=200, blank=True) completion_date = models.DateField(blank=True, null=True) - image = models.ImageField(upload_to='static/img/portfolio/', blank=True, null=True) + image = models.ImageField(upload_to='static/img/portfolio/', blank=True, null=True, verbose_name='Главное изображение') featured = models.BooleanField(default=False) category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True, related_name='portfolio_items') is_active = models.BooleanField(default=True) @@ -196,6 +196,23 @@ class PortfolioItem(models.Model): self.slug = slug super().save(*args, **kwargs) + +class PortfolioImage(models.Model): + """Дополнительные изображения для элемента портфолио""" + portfolio_item = models.ForeignKey(PortfolioItem, on_delete=models.CASCADE, related_name='gallery_images', verbose_name='Элемент портфолио') + image = models.ImageField(upload_to='static/img/portfolio/gallery/', verbose_name='Изображение') + caption = models.CharField(max_length=200, blank=True, verbose_name='Подпись к изображению') + order = models.IntegerField(default=0, verbose_name='Порядок отображения') + + class Meta: + verbose_name = 'Изображение портфолио' + verbose_name_plural = 'Изображения портфолио' + ordering = ['order', 'id'] + + def __str__(self): + return f"{self.portfolio_item.title} - Изображение {self.order}" + + class Review(models.Model): client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='reviews') service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name='reviews')