在admin.py中获取请求

时间:2012-02-29 01:52:39

标签: python django

我有一个这样的模型:

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

1 个答案:

答案 0 :(得分:1)

Django的ImageFieldFileField字段实际上并未将图像存储在数据库中。存储在数据库中的所有内容都是路径,您可以自己控制。实际的图像文件存储在文件系统中。所以我不确定你为什么会遇到这些麻烦......?

但要回答关于如何在管理员中获取request的问题,您可以覆盖ModelAdmin.save_model()