我有一个这样的模型:
class Item(models.Model):
code = models.CharField(max_length=200, unique=True)
barcode = models.CharField(max_length=300)
desc = models.CharField('Description',max_length=500)
display_desc = models.CharField('Description',max_length=500,
blank=True, null=True)
price = models.FloatField()
discountable = models.BooleanField(blank=True, default=False)
image_path = models.CharField(max_length=300,unique=True, blank=True, null=True)
def __unicode__(self):
return self.code + ' : ' + self.desc
但不幸的是,我不想将项目的图像存储在数据库中,而是希望将图像路径存储在image_path
列的服务器中。
因此,我为此对象创建了一个自定义admin.py,以便我可以通过Django管理模块编辑/插入对象。因此,下面是自定义的admin.py
class ItemAdminForm(forms.ModelForm):
file_upload = forms.FileField(required=False)
class Meta:
model = Item
def __init__(self, *args, **kwargs):
super(ItemAdminForm, self).__init__(*args,**kwargs)
#if kwargs.has_key('instance'):
# instance = kwargs['instance']
# self.initial['file_upload'] = instance.file_upload
def handle_uploaded_file(f):
destination = open('D:/Project/pensel/penselshop/static/picture', 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
return f.name
def save(self,commit=True):
name = None
extension = None
#error here! How could I get the request?
miniform = ItemAdminForm(request.POST, request.FILES)
if miniform.is_valid():
name = handle_uploaded_file(request.FILES['file_upload'])
extension = name.split('.')[1]
model = super(ItemAdminForm, self).save(commit=False)
model.image_path = '/static/picture/' + model.code + extension
if commit:
model.save()
return model
但是,在处理save()
函数期间,我注意到获取请求时出错。如何获取请求以便我可以检索文件?我注意到请求会自动添加到views.py中,但不会自动添加到admin.py
答案 0 :(得分:1)
Django的ImageField
和FileField
字段实际上并未将图像存储在数据库中。存储在数据库中的所有内容都是路径,您可以自己控制。实际的图像文件存储在文件系统中。所以我不确定你为什么会遇到这些麻烦......?
但要回答关于如何在管理员中获取request
的问题,您可以覆盖ModelAdmin.save_model()。