2017-12-07 6 views
1

私は質問がありますあなたの人はDjangoでアップロードすることは簡単だと思いますが、それは難しいです。あなたのお役に立てば幸いです!オブジェクトの名前を付けてUpload_to

# Upload_to Def 
from datetime import datetime 
def avatar_country_path(instance, filename): 
    ext = filename.split('.')[-1] 
    filename = '%s' % (instance.id) 
    datetime_str = datetime.now().strftime("%Y%m%d%H%M%S") 
    return "geo/country/%s/%s_avatar.%s" %(filename, datetime_str, ext) 

def cover_country_path(instance, filename): 
    ext = filename.split('.')[-1] 
    filename = '%s' % (instance.id) 
    datetime_str = datetime.now().strftime("%Y%m%d%H%M%S") 
    return "geo/country/%s/%s_cover.%s" %(filename, datetime_str, ext) 

def flag_country_path(instance, filename): 
    ext = filename.split('.')[-1] 
    filename = '%s' % (instance.id) 
    datetime_str = datetime.now().strftime("%Y%m%d%H%M%S") 
    return "geo/country/%s/%s_flag.%s" %(filename, datetime_str, ext) 

class BaseCountry(Place, SlugModel): 
    # More 
    avatar = models.ImageField(max_length=1024, upload_to=avatar_country_path, blank=True) 
    cover = models.ImageField(max_length=1024, upload_to=cover_country_path, blank=True) 
    flag = models.ImageField(max_length=1024, upload_to=flag_country_path, blank=True 

見ての通り、私はNAME OF FIELDS (avatar, cover, flag)でちょうど異なる、同様の経路でupload_to作るために3つの機能を必要とするが、私はそれを短縮する方法を知りません。

あなたは私を助けてくれますか?

+0

"Def"のようなものはありません。これらは関数またはメソッドです。 –

答えて

2

次のようなコードを短縮する方法を考え出すためのトリックは重複行を探し、そのようにように、残りをパラメータ化しようとすることです:あなたは、パスを作成するために必要なロジックを変更することができます

from datetime import datetime 

def inject_field_type(instance, filename, suffix): 
    ext = filename.split('.')[-1] 
    filename = '%s' % (instance.id) 
    datetime_str = datetime.now().strftime("%Y%m%d%H%M%S") 
    return "geo/country/%s/%s_%s.%s" %(filename, datetime_str, ext, suffix) 

def avatar_country_path(instance, filename): 
    return inject_field_type(instance, filename, 'avatar') 

def cover_country_path(instance, filename): 
    return inject_field_type(instance, filename, 'cover') 

def flag_country_path(instance, filename): 
    return inject_field_type(instance, filename, 'flag') 

class BaseCountry(Place, SlugModel): 
    avatar = models.ImageField(max_length=1024, upload_to=avatar_country_path, blank=True) 
    cover = models.ImageField(max_length=1024, upload_to=cover_country_path, blank=True) 
    flag = models.ImageField(max_length=1024, upload_to=flag_country_path, blank=True 

この方法3つの異なる機能で変更するのではなく、3つのフィールドすべてに影響を与えます。

+0

とにかく、3つのフィールドに1つのDefを使用するだけですか? –

関連する問題