articles
This commit is contained in:
parent
01d35a461b
commit
d1926cfc17
12 changed files with 862 additions and 4 deletions
90
hub/services/admin/articles.py
Normal file
90
hub/services/admin/articles.py
Normal file
|
@ -0,0 +1,90 @@
|
|||
"""
|
||||
Admin configuration for Article model
|
||||
"""
|
||||
|
||||
from django.contrib import admin
|
||||
from django.utils.html import format_html
|
||||
from django import forms
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
|
||||
from ..models import Article
|
||||
|
||||
|
||||
class ArticleAdminForm(forms.ModelForm):
|
||||
"""Custom form for Article admin with validation"""
|
||||
|
||||
class Meta:
|
||||
model = Article
|
||||
fields = "__all__"
|
||||
|
||||
def clean_title(self):
|
||||
"""Validate title length"""
|
||||
title = self.cleaned_data.get("title")
|
||||
if title and len(title) > 50:
|
||||
raise ValidationError("Title must be 50 characters or less.")
|
||||
return title
|
||||
|
||||
def clean_excerpt(self):
|
||||
"""Validate excerpt length"""
|
||||
excerpt = self.cleaned_data.get("excerpt")
|
||||
if excerpt and len(excerpt) > 200:
|
||||
raise ValidationError("Excerpt must be 200 characters or less.")
|
||||
return excerpt
|
||||
|
||||
|
||||
@admin.register(Article)
|
||||
class ArticleAdmin(admin.ModelAdmin):
|
||||
"""Admin configuration for Article model"""
|
||||
|
||||
form = ArticleAdminForm
|
||||
|
||||
list_display = (
|
||||
"title",
|
||||
"author",
|
||||
"image_preview",
|
||||
"is_published",
|
||||
"is_featured",
|
||||
"created_at",
|
||||
)
|
||||
list_filter = (
|
||||
"is_published",
|
||||
"is_featured",
|
||||
"author",
|
||||
"related_service",
|
||||
"related_consulting_partner",
|
||||
"related_cloud_provider",
|
||||
"created_at",
|
||||
)
|
||||
search_fields = ("title", "excerpt", "content", "meta_keywords")
|
||||
prepopulated_fields = {"slug": ("title",)}
|
||||
readonly_fields = ("created_at", "updated_at")
|
||||
|
||||
def image_preview(self, obj):
|
||||
"""Display image preview in admin list view"""
|
||||
if obj.image:
|
||||
return format_html(
|
||||
'<img src="{}" style="max-height: 50px;"/>', obj.image.url
|
||||
)
|
||||
return "No image"
|
||||
|
||||
image_preview.short_description = "Image"
|
||||
|
||||
def related_to_display(self, obj):
|
||||
"""Display what this article is related to"""
|
||||
return obj.related_to
|
||||
|
||||
related_to_display.short_description = "Related To"
|
||||
|
||||
def get_queryset(self, request):
|
||||
"""Optimize queries by selecting related objects"""
|
||||
return (
|
||||
super()
|
||||
.get_queryset(request)
|
||||
.select_related(
|
||||
"author",
|
||||
"related_service",
|
||||
"related_consulting_partner",
|
||||
"related_cloud_provider",
|
||||
)
|
||||
)
|
Loading…
Add table
Add a link
Reference in a new issue