2012-04-02 3 views
3

私はfirst_namelast_nameというフィールドを持つモデルを持っていて、これはImageFieldにファイル名を作るために使われます。 ImageFieldupload_toの引数は、このインスタンスの情報でファイル名を生成するこのメソッドです。Djangoモデルのインスタンスを保存しているとき、ModelField属性として使用されているメソッドに対して、clean()とsave()のオーバーライドがどのような順序で適用されますか?

このモデルインスタンスを保存すると、ファイル名の生成に使用される前にclean().strip()への呼び出しがフィールドに適用されますか?または、それが使用されているときだけでなく、クリーンでもデータ上で.strip()を実行する必要がありますか?

models.pyは:

def set_path(instance, filename): 
    """ 
    Set the path to be used for images uploaded (trainer photos). 
    """ 
    return u'about/%(first)s_%(last)s.%(ext)s' % { 
     'first': instance.first_name.strip(' \t').lower(), #.strip() required? 
     'last': instance.last_name.strip(' \t').lower(), #.strip() required? 
     'ext': filename.split('.')[-1] 
    } 

class Trainer(models.Model): 
    """ 
    Trainers and their associated information. 
    """ 
    first_name = models.CharField(max_length=25) 
    last_name = models.CharField(max_length=25) 
    image = models.ImageField(upload_to=set_path, blank=True, null=True, 
     verbose_name="Trainer image") 
    description = models.TextField() 

    class Meta: 
     unique_together = ('first_name', 'last_name',) 

    def clean(self): 
     super(Trainer, self).clean() 
     # Are these calls to .strip() applied before the fields 
     # get used as `instance` to determine a filename? 
     self.first_name = self.first_name.strip(' \t') 
     self.last_name = self.last_name.strip(' \t') 
     self.description = self.description.strip(' \t\r\n') 

答えて

3

upload_to引数の呼び出し可能がある場合は、モデルベースのsave()メソッドの間に呼び出されます。 save()はもちろんclean()の後に呼び出されるので、clean()メソッドですでに行っていれば、フィールドをstrip()する必要はありません。

コードはDjangoのソースコードの行85に呼び出されたどこで見ることができます:https://code.djangoproject.com/browser/django/trunk/django/db/models/fields/files.py

generate_filenameあなたはupload_toに渡されたものは何でも指す格納された変数です。

したがって、オーダーはupload_to()を呼び出すフォームsubmit-> model.full_clean() - > overridden clean() - > save()です。

関連する問題