Как правильно интегрировать Filepicker.io, Django и S3

Я делаю приложение Django, которое позволяет пользователям загружать изображения через интерфейс администратора, а затем получать доступ к URL-адресу этих изображений через конечную точку API. В интерфейсе администратора пользователю должен быть представлен виджет Filepicker.io (чтобы включить функцию перетаскивания и т. д.), и файл должен быть загружен на S3. Я уже ввел свои учетные данные S3 на странице администрирования Filpicker моей учетной записи.

Мой вопрос заключается в том, как собрать все эти элементы вместе. Вот соответствующие файлы из моего проекта:

# models.py
from django.db import models
from django_filepicker.models import FPFileField

# Add field introspection for FPFileField 
# See http://south.aeracode.org/wiki/MyFieldsDontWork
from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^django_filepicker\.models\.FPFileField"])

class Product(models.Model):
    product_logo = FPFileField(upload_to='uploads')

# forms.py
from django import forms
from django_filepicker.forms import FPFileField
from django_filepicker.widgets import FPFileWidget
from example.models import Product

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product

    def __init__(self, *args, **kwargs):
        self.fields['product_logo'] = FPFileField(widget = FPFileWidget)
        super(ProductForm, self).__init__(*args, **kwargs)

# views.py
from django.http import HttpResponse
from example.models import Product
import json

def example_view():
    result = []
    products = Product.objects.all()
    for product in products:
        # I want the S3 URL here!
        result.append(product.product_logo.url)
    return HttpResponse(json.dumps(result, indent=2))

Мои проблемы:

  1. Интерфейс администратора Django отображает обычный виджет Django FileField, тогда как вместо этого я хочу использовать FPFileWidget.
  2. Я хочу, чтобы файлы изображений загружались на S3 (а не в каталог /media моего сайта)
  3. Я хочу получить URL-адреса S3, а не URL-адреса /media/xxxx.

Например, типичный ответ в настоящее время таков:

[
  "/media/uploads/fp-file", 
  "/media/uploads/fp-file_1", 
  "/media/uploads/fp-file_2", 
  "/media/uploads/fp-file_3", 
  "/media/uploads/fp-file_4", 
  "/media/uploads/fp-file_5"
]

Но я хочу что-то вроде:

[
  "https://s3-ap-southeast-2.amazonaws.com/XXXXXXXXX/TBtOcRSNyBAZZuNBFOpA_blah.png", 
  "https://s3-ap-southeast-2.amazonaws.com/XXXXXXXXX/8ODleDuKRIOAglFs0sKl_etc.png", 
]


person Matt Harley    schedule 23.01.2013    source источник


Ответы (2)


Вам нужно будет изменить DEFAULT_STORAGE_BACKEND на серверную часть хранилища s3. Пожалуйста, взгляните на серверную часть amazon-S3 django-storages.

Для использования FPFileWidget на панели администратора, пожалуйста, посмотрите Администратор Django: использование пользовательского виджета только для одного поля модели.

Изменение этих двух настроек должно работать на вас.

person pankaj28843    schedule 23.01.2013
comment
Спасибо! Я исправил проблему 1. по вашей ссылке. Проверим django-storages - person Matt Harley; 24.01.2013
comment
Дайте мне знать, если вы столкнетесь с какой-либо другой трудностью. - person pankaj28843; 24.01.2013
comment
Привет, ребята, @psjinx, у меня вопрос. Я уже изменил свой DEFAULT_STORAGE_BACKEND, но кажется, что файл загружается в сборщик файлов, а затем в s3, в модальном сборщике файлов и при отправке формы. Есть ли способ связать файл в сборщике файлов с FPFileField моей модели вместо повторной загрузки на s3? Заранее спасибо. - person Joseph Lafuente; 30.01.2013
comment
FPFileField не хранит файл fpurl. - person pankaj28843; 31.01.2013
comment
Пожалуйста, взгляните на github.com/Filepicker/django-filepicker. /blob/master/ URLFileMapperMiddleware дает вам загруженные файлы в request.FILES, но вы также получаете фактические URL-адреса в request.POST. - person pankaj28843; 31.01.2013

Взгляните на FPURlField, это должно дать вам то, что вам нужно. Текущие FP * Fields не имеют интерфейсов администратора, но будут рады принять запрос на включение, если вы хотите внести свой код обратно.

person brettcvz    schedule 23.01.2013
comment
Спасибо, Бретт. Теперь поле URL-адреса FPFileField указывает на filepicker.io/api/file/XXXXXXXX. что хоть и не указывает на S3, но лучше, чем файлы заливаемые в /media - person Matt Harley; 24.01.2013