129 lines
4.8 KiB
Python
129 lines
4.8 KiB
Python
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 |