Add PortfolioImage model for multiple images per portfolio item with inline admin
This commit is contained in:
@@ -3,7 +3,7 @@ from .models import (
|
|||||||
Service, Project, Client, Order, Review, BlogPost,
|
Service, Project, Client, Order, Review, BlogPost,
|
||||||
Category, ServiceRequest, AboutPage, FooterSettings, TeamMember,
|
Category, ServiceRequest, AboutPage, FooterSettings, TeamMember,
|
||||||
PortfolioItem, PrivacyPolicy, TermsOfUse, NewsArticle, CareerVacancy,
|
PortfolioItem, PrivacyPolicy, TermsOfUse, NewsArticle, CareerVacancy,
|
||||||
SiteSettings
|
SiteSettings, PortfolioImage
|
||||||
)
|
)
|
||||||
from .forms import ProjectForm
|
from .forms import ProjectForm
|
||||||
|
|
||||||
@@ -49,12 +49,25 @@ class CategoryAdmin(admin.ModelAdmin):
|
|||||||
search_fields = ('name',)
|
search_fields = ('name',)
|
||||||
|
|
||||||
|
|
||||||
|
class PortfolioImageInline(admin.TabularInline):
|
||||||
|
model = PortfolioImage
|
||||||
|
extra = 3
|
||||||
|
fields = ('image', 'caption', 'order')
|
||||||
|
verbose_name = 'Дополнительное изображение'
|
||||||
|
verbose_name_plural = 'Галерея изображений'
|
||||||
|
|
||||||
|
|
||||||
@admin.register(PortfolioItem)
|
@admin.register(PortfolioItem)
|
||||||
class PortfolioItemAdmin(admin.ModelAdmin):
|
class PortfolioItemAdmin(admin.ModelAdmin):
|
||||||
list_display = ('title', 'client_name', 'completion_date', 'featured', 'is_active')
|
list_display = ('title', 'client_name', 'completion_date', 'featured', 'is_active', 'gallery_count')
|
||||||
list_filter = ('featured', 'is_active', 'completion_date')
|
list_filter = ('featured', 'is_active', 'completion_date', 'category')
|
||||||
search_fields = ('title', 'client_name')
|
search_fields = ('title', 'client_name', 'description')
|
||||||
prepopulated_fields = {'slug': ('title',)}
|
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)
|
@admin.register(NewsArticle)
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ class PortfolioItem(models.Model):
|
|||||||
description = models.TextField()
|
description = models.TextField()
|
||||||
client_name = models.CharField(max_length=200, blank=True)
|
client_name = models.CharField(max_length=200, blank=True)
|
||||||
completion_date = models.DateField(blank=True, null=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)
|
featured = models.BooleanField(default=False)
|
||||||
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True, related_name='portfolio_items')
|
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True, related_name='portfolio_items')
|
||||||
is_active = models.BooleanField(default=True)
|
is_active = models.BooleanField(default=True)
|
||||||
@@ -196,6 +196,23 @@ class PortfolioItem(models.Model):
|
|||||||
self.slug = slug
|
self.slug = slug
|
||||||
super().save(*args, **kwargs)
|
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):
|
class Review(models.Model):
|
||||||
client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='reviews')
|
client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='reviews')
|
||||||
service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name='reviews')
|
service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name='reviews')
|
||||||
|
|||||||
Reference in New Issue
Block a user