- requirements.txt: remove unused packages (django-imagekit, django-taggit, python-slugify), keep 4 actual deps - import_example_images.py: remove grid_size variable and param to fix TypeError - README.md: correct repo dir name, add comment/search/category/login docs, fix tech stack and project structure, update data model (remove grid_size, add Comment), add v1.1.0 changelog Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
139 lines
6.2 KiB
Python
139 lines
6.2 KiB
Python
import os
|
||
import random
|
||
from django.core.management.base import BaseCommand
|
||
from django.core.files import File
|
||
from gallery.models import Artwork, Category, About
|
||
from django.conf import settings
|
||
|
||
|
||
class Command(BaseCommand):
|
||
help = '导入示例图片到画廊数据库'
|
||
|
||
def handle(self, *args, **options):
|
||
self.stdout.write(self.style.SUCCESS('开始导入示例图片...'))
|
||
|
||
# 1. 创建分类
|
||
categories = self.create_categories()
|
||
self.stdout.write(self.style.SUCCESS(f'创建了 {len(categories)} 个分类'))
|
||
|
||
# 2. 创建关于页面
|
||
self.create_about_page()
|
||
self.stdout.write(self.style.SUCCESS('创建了关于页面'))
|
||
|
||
# 3. 导入示例图片
|
||
example_dir = os.path.join(settings.BASE_DIR, 'example_img')
|
||
if os.path.exists(example_dir):
|
||
image_files = [f for f in os.listdir(example_dir) if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
|
||
self.stdout.write(self.style.SUCCESS(f'找到 {len(image_files)} 张示例图片'))
|
||
|
||
artworks_created = 0
|
||
for i, filename in enumerate(image_files):
|
||
try:
|
||
# 检查是否已经存在相同文件名的作品
|
||
if Artwork.objects.filter(image__endswith=filename).exists():
|
||
self.stdout.write(self.style.WARNING(f' 已存在: {filename},跳过'))
|
||
continue
|
||
|
||
artwork = self.create_artwork_from_image(example_dir, filename, i, categories)
|
||
if artwork:
|
||
artworks_created += 1
|
||
self.stdout.write(self.style.SUCCESS(f' 已导入: {artwork.title}'))
|
||
except Exception as e:
|
||
self.stdout.write(self.style.ERROR(f' 导入失败 {filename}: {str(e)}'))
|
||
|
||
self.stdout.write(self.style.SUCCESS(f'成功导入 {artworks_created} 个作品'))
|
||
else:
|
||
self.stdout.write(self.style.WARNING('未找到 example_img 目录,跳过图片导入'))
|
||
|
||
self.stdout.write(self.style.SUCCESS('示例数据导入完成!'))
|
||
|
||
def create_categories(self):
|
||
"""创建作品分类"""
|
||
categories_data = [
|
||
{'name': '风景摄影', 'slug': 'landscape'},
|
||
{'name': '人像摄影', 'slug': 'portrait'},
|
||
{'name': '城市建筑', 'slug': 'architecture'},
|
||
{'name': '自然生态', 'slug': 'nature'},
|
||
{'name': '抽象艺术', 'slug': 'abstract'},
|
||
]
|
||
|
||
categories = []
|
||
for data in categories_data:
|
||
category, created = Category.objects.get_or_create(
|
||
slug=data['slug'],
|
||
defaults={'name': data['name']}
|
||
)
|
||
if created:
|
||
categories.append(category)
|
||
|
||
return categories
|
||
|
||
def create_about_page(self):
|
||
"""创建关于页面"""
|
||
if not About.objects.exists():
|
||
About.objects.create(
|
||
title='关于 YITAO-REN GALLERY',
|
||
content='''YITAO-REN GALLERY 是一个专注于现代摄影艺术展示的在线平台。
|
||
|
||
我们的使命是发现和推广具有独特视角和艺术价值的摄影作品,为艺术家和艺术爱好者搭建一个交流与展示的空间。
|
||
|
||
画廊成立于2026年,名字来源于创始人对于摄影艺术的热爱与追求。"Yitao"代表着艺术的独特道路,"Ren"象征着人文关怀。我们相信,每一幅摄影作品都是摄影师与世界对话的方式,是瞬间与永恒的完美结合。
|
||
|
||
在 YITAO-REN GALLERY,您可以:
|
||
- 欣赏高质量的现代摄影艺术作品
|
||
- 了解新兴摄影艺术家的创作理念
|
||
- 参与线上艺术交流活动
|
||
- 收藏您喜爱的摄影作品
|
||
|
||
我们致力于为每一位访问者提供优质的视觉体验,让艺术触手可及。'''
|
||
)
|
||
|
||
def create_artwork_from_image(self, example_dir, filename, index, categories):
|
||
"""从图片文件创建作品"""
|
||
# 作品标题和描述
|
||
titles = [
|
||
'晨曦微光', '城市脉络', '静谧时光', '光影交错', '自然韵律',
|
||
'建筑美学', '人文纪实', '色彩交响', '视觉诗篇', '时空印记',
|
||
'抽象表达', '情感共鸣', '创意无限'
|
||
]
|
||
|
||
descriptions = [
|
||
'捕捉清晨第一缕阳光洒在大地上的温暖瞬间,展现自然与光的和谐对话。',
|
||
'现代都市的脉络与节奏,钢筋水泥中的生命律动,城市发展的视觉记录。',
|
||
'时光在静谧中流淌,记录那些被遗忘的角落和沉淀的记忆。',
|
||
'光与影的舞蹈,明暗对比中展现物体的立体感和空间层次。',
|
||
'大自然的韵律与节奏,山川河流的壮美与微观世界的精妙。',
|
||
'建筑的结构美学与空间哲学,几何线条中的力量与平衡。',
|
||
'人文关怀的视觉表达,记录时代变迁中的人物与故事。',
|
||
'色彩的碰撞与融合,视觉上的交响乐,情感的温度计。',
|
||
'用镜头书写的视觉诗篇,每一帧都是情感的抒发和思想的表达。',
|
||
'时间与空间的交汇点,记录那些转瞬即逝的珍贵时刻。',
|
||
'超越具象的视觉语言,用形状、色彩和纹理表达内在情感。',
|
||
'触动心灵的情感连接,让观者与作品产生深层次的共鸣。',
|
||
'突破传统的创意表达,探索摄影艺术的无限可能性。'
|
||
]
|
||
|
||
# 选择标题和描述
|
||
title_index = index % len(titles)
|
||
description_index = index % len(descriptions)
|
||
|
||
# 随机选择分类
|
||
category = random.choice(categories) if categories else None
|
||
|
||
# 创建作品
|
||
artwork = Artwork(
|
||
title=titles[title_index],
|
||
description=descriptions[description_index],
|
||
order=index * 10, # 按导入顺序排序
|
||
category=category
|
||
)
|
||
|
||
# 保存图片
|
||
image_path = os.path.join(example_dir, filename)
|
||
with open(image_path, 'rb') as f:
|
||
artwork.image.save(filename, File(f), save=False)
|
||
|
||
# 保存作品
|
||
artwork.save()
|
||
|
||
return artwork |