Files
2026-02-25 16:47:17 +08:00

129 lines
4.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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