2014-02-17 70 views
0

這是我使用的化身模型領域:Django模型字段__class__顯示自己爲不同的類?

class AvatarField(models.ImageField): 
    def __init__(self, *args, **kwargs): 

     self.width = kwargs.pop('width', config.width) 
     self.height = kwargs.pop('height', config.height) 

     kwargs['upload_to'] = kwargs.get('upload_to', config.upload_to) 

     super(AvatarField, self).__init__(*args, **kwargs) 

    def formfield(self, **kwargs): 
     defaults = {'form_class': forms.AvatarField} 
     defaults['width'] = self.width 
     defaults['height'] = self.height 
     defaults.update(kwargs) 
     return super(AvatarField, self).formfield(**defaults) 

    def save_form_data(self, instance, data): 
     # if data and self.width and self.height: 
     file_ = data['file'] 
     if file_: 

      image = Image.open(StringIO(file_.read())) 
      image = image.crop(data['box']) 
      image = image.resize((self.width, self.height), Image.ANTIALIAS) 

      content = StringIO() 
      image.save(content, config.save_format, quality=config.save_quality) 

      file_name = '{}.{}'.format(os.path.splitext(file_.name)[0], config.save_format) 

      # new_data = SimpleUploadedFile(file.name, content.getvalue(), content_type='image/' + config.save_format) 
      new_data = InMemoryUploadedFile(content, None, file_name, 'image/' + config.save_format, len(content.getvalue()), None) 
      super(AvatarField, self).save_form_data(instance, new_data) 

它的剖面模型的使用:

avatar = AvatarField(upload_to='avatars', width=100, height=100) 

__class__顯示爲ImageFieldFile?

In [1]: p = Profile.objects.all()[0] 

In [2]: p.avatar.__class__ 
Out[2]: django.db.models.fields.files.ImageFieldFile 

回答

0

閱讀一些更documentation後,我意識到了這一點:

重要的是要認識到,一個Django場類不是什麼 存儲在你的模型屬性是非常重要的。模型屬性包含Python對象的普通 。在模型中創建模型類時,您在模型中定義的字段類實際上是存儲在Meta類中的 (這裏詳細說明了如何完成此操作的細節並不重要)。這是因爲在創建和修改 屬性時, 字段類不是必需的。相反,它們提供了在 之間轉換屬性值和存儲在數據庫中或發送到 序列化程序的機制。

相關問題