Initial commit: Django gallery project
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
129
gallery/forms.py
Normal file
129
gallery/forms.py
Normal 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
|
||||
Reference in New Issue
Block a user