這裏是可以作爲一個簡單的模型領域的解決方案,就可以把代替models.ImageField
:
class Icon(models.Model):
image_file = SVGAndImageField()
你需要在你的代碼某處定義以下類和功能:
from django.db import models
class SVGAndImageField(models.ImageField):
def formfield(self, **kwargs):
defaults = {'form_class': SVGAndImageFieldForm}
defaults.update(kwargs)
return super().formfield(**defaults)
這裏是如何SVGAndImageFieldForm
樣子:
from django import forms
from django.core.exceptions import ValidationError
class SVGAndImageFieldForm(forms.ImageField):
def to_python(self, data):
try:
f = super().to_python(data)
except ValidationError:
return validate_svg(data)
return f
功能validate_svg
我從其他的解決方案了:
import xml.etree.cElementTree as et
def validate_svg(f):
# Find "start" word in file and get "tag" from there
f.seek(0)
tag = None
try:
for event, el in et.iterparse(f, ('start',)):
tag = el.tag
break
except et.ParseError:
pass
# Check that this "tag" is correct
if tag != '{http://www.w3.org/2000/svg}svg':
raise ValidationError('Uploaded file is not an image or SVG file.')
# Do not forget to "reset" file
f.seek(0)
return f
另外,如果你想使用SVG文件只模型場 - 你可以做到這一點更簡單。
只需創建類,繼承自models.FileField
,並在__init__
方法中您可以將validate_svg
函數添加到kwargs['validators']
。
或者只是添加這個驗證程序models.FileField
和快樂:)
的ImageField的和FileField字段之間的基本區別在於,首先檢查文件是否使用枕頭的圖像,並提供了幾個屬性的可能無關你(高度,寬度)。 FileField不適合您的需求嗎? https://github.com/django/django/blob/master/django/db/models/fields/files.py – Wtower
@Wower我寧願如果它不讓非圖像格式通過。 –