Django: Хранение относительных и абсолютных путей к изображениям в ImageField - PullRequest
2 голосов
/ 14 сентября 2011

На моем сайте пользователи могут загружать свои собственные изображения профиля, которыми я управляю через ImageField в модели UserProfile, которая расширяет основную модель User.Вот упрощенная версия модели UserProfile:

class UserProfile(models.Model):
    picture = models.ImageField(upload_to='img', blank=True, null=True)
    profile_picture = models.ImageField(upload_to='img', default='img/profile/default_profile.png', blank=True, null=True)
    user = models.ForeignKey(User, unique=True)

Я использую PIL для создания уменьшенной версии загруженного изображения.

Чтобы отобразить изображение профиля в моем шаблоне, я использую функцию url, рекомендованную в следующих документах:

{{ user.get_profile.profile_picture.url }}

Проблема, с которой я сталкиваюсь, - это когдаПользователь подключает свою учетную запись к Facebook и хочет использовать свою фотографию в Facebook как свою фотографию на моем сайте.

Как лучше всего обрабатывать отображение загруженного пользователем изображения или его профиля в Facebook, в зависимости от настроек, указанных пользователем?

Если я сохраню путь к Facebookизображение профиля в поле profile_picture, я буду вынужден сделать проверку перед отображением каждого изображения профиля на сайте, в противном случае я получу свой MEDIA_ROOT / MEDIA_URL, предварительно предваренный к изображению:

/media/https://graph.facebook.com/[fbid]/picture

Мой другой вариант - добавить MEDIA_ROOT / MEDIA_URL в поле profile_picture при загрузке изображения.К сожалению, единственный способ сделать это - использовать функцию add_profile_picture в моем views.py, так как Django по умолчанию хранит пути к изображениям без начального слеша, а также потому, что PIL становится неестественным, если вы пытаетесь открыть изображение, относительный путь которогоначинается с косой черты.Однако, если я предварительно ожидаю полный путь к изображению, мне не нужно использовать функцию url в моих шаблонах, и я могу просто отобразить изображение следующим образом, и оно будет работать правильно, независимо от того, загружено ли это изображение или изображение Facebook:

{{ user.get_profile.profile_picture }}

Однако оба эти варианта выглядят как хаки, и я чувствую, что должен быть более эффективный способ сделать это, поэтому я обращаюсь к SO за некоторым вдохновением / руководством по лучшим практикам здесь.

Заранее благодарим за помощь.

1 Ответ

1 голос
/ 14 сентября 2011

Пара возможностей:

  1. при записи, переопределение save() и преобразование заданного значения в требуемое значение перед записью в базу данных, или
  2. при чтении, созданиеметод, который проверяет сохраненное значение и массирует его в соответствующий шаблон.Примените декоратор @property, чтобы вы могли получить к нему доступ непосредственно из шаблона

Я мог бы добавить, что в моем собственном сражении по этим направлениям (таким же, но другим) я вообще отказался от ImageField в пользуCharField и позвольте вышеприведенным подпрограммам обрабатывать уникальные детали изображения (например, миниатюру).

...