08.02.2009 16:59

  1. Объясните пожалуйста, почему в классах полей джанго, вечно присутствует вот такие строки

    attr_class = ImageFieldFile


    почему просто не сабкласнуть ImageFieldFile? В чём фишка?
  2. anonymous

    0 ↑
    0 ↓
    ImageFieldFile далекий предок стандартного питоновского file.
    ImageField - вообще из «другой оперы», предок джанговского Field.

    Соотношение «Is-a» (наследование) не имеет смысла, правильно использовать «Has-a».

    Еще это почитайте: http://softwaremaniacs.org/blog/2008/11/17/django-file-backend-chart/

  3. anonymous

    0 ↑
    0 ↓
    Тьфу, потомок конечно же.
  4. anonymous, не, я не это имел ввиду.. Не конкретно ImageFieldFile или другой фиелд. А вообще.. Почему атрибуты? Почему не наследование?
  5. Почему атрибуты? Почему не наследование?

    Потому что это разные вещи и для разного применяются.

  6. Когда мы имеем такую модель:

    class Article(models.Model):
        title = models.CharField(...)
    

    ... и потом создаем ее объект, то атрибут title — это совсем не models.CharField:

    article = Article.objects.get(...)
    article.title # юникодная строка
    

    Процесс замены одного на другое происходит в метаклассе модели. Там все инстансы классов полей заменяются на соответствующие атрибуты. И вот это соответствие надо где-то иметь. Вот оно и задается через attr_class у поля.

    Так же и с картиночными полями. ImageField занимается заданием свойств обработки картинок у модели, а атрибут — ImageFieldFiel — уже представляет собой непосредственно картинку.

  7. Иван Сагалаев, и как же оверрайднуть такой метод?
    Например в файле django.db.models.fields.files 77ая строка с save() методом?
  8. Очень трудно загадки разгадывать :-). Я правильно понимаю, что вы хотите сделать ImageField с созданием превьюшек? Если да, то вам нужны два класса:

    • Наследник от ImageFieldFile, в котором перекрывается save()

    • Наследник от ImageField, который отличается только тем, что тянет за собой ваш файловый класс, а не стандартный, типа:

      class MyImageField(models.ImageField):
          attr_class = MyImageFieldFile
      
  9. Иван Сагалаев, а говорите что загадки трудные )) В точку ))

    Спасибо, я примерно так и представлял, просто подумал может тут какая магия имеется.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.