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