-
Объясните пожалуйста, почему в классах полей джанго, вечно присутствует вот такие строки
attr_class = ImageFieldFile
почему просто не сабкласнуть ImageFieldFile? В чём фишка? -
ImageFieldFile далекий предок стандартного питоновского file.
ImageField - вообще из «другой оперы», предок джанговского Field.
Соотношение «Is-a» (наследование) не имеет смысла, правильно использовать «Has-a».
Еще это почитайте: http://softwaremaniacs.org/blog/2008/11/17/django-file-backend-chart/
-
Тьфу, потомок конечно же.
-
anonymous, не, я не это имел ввиду.. Не конкретно ImageFieldFile или другой фиелд. А вообще.. Почему атрибуты? Почему не наследование?
-
Почему атрибуты? Почему не наследование?
Потому что это разные вещи и для разного применяются.
-
Когда мы имеем такую модель:
class Article(models.Model): title = models.CharField(...)... и потом создаем ее объект, то атрибут title — это совсем не
models.CharField:article = Article.objects.get(...) article.title # юникодная строкаПроцесс замены одного на другое происходит в метаклассе модели. Там все инстансы классов полей заменяются на соответствующие атрибуты. И вот это соответствие надо где-то иметь. Вот оно и задается через
attr_classу поля.Так же и с картиночными полями. ImageField занимается заданием свойств обработки картинок у модели, а атрибут — ImageFieldFiel — уже представляет собой непосредственно картинку.
-
Иван Сагалаев, и как же оверрайднуть такой метод?
Например в файле django.db.models.fields.files 77ая строка с save() методом?
-
Очень трудно загадки разгадывать :-). Я правильно понимаю, что вы хотите сделать ImageField с созданием превьюшек? Если да, то вам нужны два класса:
Наследник от ImageFieldFile, в котором перекрывается save()
Наследник от ImageField, который отличается только тем, что тянет за собой ваш файловый класс, а не стандартный, типа:
class MyImageField(models.ImageField): attr_class = MyImageFieldFile
-
Иван Сагалаев, а говорите что загадки трудные )) В точку ))
Спасибо, я примерно так и представлял, просто подумал может тут какая магия имеется.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.


