Initial commit: Django gallery project

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-25 16:47:17 +08:00
commit 8b57a7b66a
53 changed files with 3633 additions and 0 deletions

129
gallery/forms.py Normal file
View File

@@ -0,0 +1,129 @@
from django import forms
import os
from .models import Artwork, Category, About, Comment
class ArtworkForm(forms.ModelForm):
"""作品表单"""
class Meta:
model = Artwork
fields = [
'title',
'description',
'image',
'category',
'order',
]
widgets = {
'title': forms.TextInput(attrs={
'class': 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500',
'placeholder': '请输入作品标题'
}),
'description': forms.Textarea(attrs={
'class': 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500',
'rows': 4,
'placeholder': '请输入作品描述'
}),
'image': forms.FileInput(attrs={
'class': 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500'
}),
'category': forms.Select(attrs={
'class': 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500'
}),
'order': forms.NumberInput(attrs={
'class': 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500',
'min': 0
}),
}
class CategoryForm(forms.ModelForm):
"""分类表单"""
class Meta:
model = Category
fields = ['name']
widgets = {
'name': forms.TextInput(attrs={
'class': 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500',
'placeholder': '请输入分类名称'
}),
}
class AboutForm(forms.ModelForm):
"""关于页面表单"""
class Meta:
model = About
fields = ['title', 'content', 'image']
widgets = {
'title': forms.TextInput(attrs={
'class': 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500',
'placeholder': '请输入标题'
}),
'content': forms.Textarea(attrs={
'class': 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500',
'rows': 8,
'placeholder': '请输入内容'
}),
'image': forms.FileInput(attrs={
'class': 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500'
}),
}
class SearchForm(forms.Form):
"""搜索表单"""
q = forms.CharField(
required=False,
widget=forms.TextInput(attrs={
'class': 'w-full px-4 py-2 bg-gray-800 text-white rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500',
'placeholder': '搜索作品...',
'autocomplete': 'off'
})
)
class CommentForm(forms.ModelForm):
"""评论表单"""
class Meta:
model = Comment
fields = ['text', 'image']
widgets = {
'text': forms.Textarea(attrs={
'class': 'w-full px-3 py-2 border border-gray-700 rounded-lg bg-gray-900 text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent',
'rows': 4,
'placeholder': '写下您的评论...'
}),
'image': forms.ClearableFileInput(attrs={
'class': 'block w-full text-sm text-gray-400 file:mr-4 file:py-2 file:px-4 file:rounded-full file:border-0 file:text-sm file:font-semibold file:bg-gray-800 file:text-white hover:file:bg-gray-700',
'accept': 'image/*'
})
}
def clean(self):
"""验证至少填写文本或上传图片"""
cleaned_data = super().clean()
text = cleaned_data.get('text')
image = cleaned_data.get('image')
if not text and not image:
raise forms.ValidationError('请填写评论内容或上传图片')
return cleaned_data
def clean_image(self):
"""验证上传的图片"""
image = self.cleaned_data.get('image')
if image:
# 文件大小限制5MB
if image.size > 5 * 1024 * 1024:
raise forms.ValidationError('图片大小不能超过5MB')
# 文件类型验证
valid_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp']
ext = os.path.splitext(image.name)[1].lower()
if ext not in valid_extensions:
raise forms.ValidationError('不支持的文件格式,请上传图片文件')
return image