При сохранении экземпляра модели Django в каком порядке применяются мои переопределения clean () и save () относительно методов, используемых в качестве атрибутов ModelField? - PullRequest
3 голосов
/ 02 апреля 2012

У меня есть модель с полями first_name и last_name, и они используются для создания имени файла в ImageField. Аргумент для upload_to в ImageField - это метод, который генерирует имя файла с информацией об этом экземпляре.

Когда этот экземпляр модели будет сохранен, будут ли вызовы .strip() в clean() применяться к полям, прежде чем они будут использованы для создания имени файла? Или мне нужно сделать .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')

1 Ответ

3 голосов
/ 02 апреля 2012

Если для аргумента upload_to есть вызываемый объект, он вызывается во время метода save () базы модели.Функция save (), конечно, вызывается после clean (), поэтому вам не нужно удалять () любые поля, если вы уже сделали это в методе clean ().

Вы можете увидеть, где находится кодВызывается в строке 85 исходного кода Django: https://code.djangoproject.com/browser/django/trunk/django/db/models/fields/files.py

generate_filename - это хранимая переменная, которая указывает на то, что вы передали в upload_to.

Итак, порядок - это форма отправки -> model.full_clean () -> переопределить clean () -> save (), который вызывает upload_to ()

...