【问题标题】:How to correctly integrate Filepicker.io, Django and S3如何正确集成 Filepicker.io、Django 和 S3
【发布时间】:2013-01-23 05:00:08
【问题描述】:

我正在制作一个 Django 应用程序,它允许用户通过管理界面上传图片,然后通过 API 端点访问这些图片的 URL。在管理界面上,应该向用户呈现 Filepicker.io 小部件(以启用拖放功能等),并且应该将文件上传到 S3。我已经在我帐户的 Filpicker 管理页面中输入了我的 S3 凭据。

我的问题是如何将所有这些元素结合在一起。这里是我项目中的相应文件:

# 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. 我想检索 S3 URL 而不是 /media/xxxx URL。

例如,当前的典型响应是这样的:

[
  "/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", 
]

【问题讨论】:

    标签: python django filepicker.io


    【解决方案1】:

    您需要将DEFAULT_STORAGE_BACKEND 更改为s3 存储后端。请看amazon-S3 backend of django-storages

    要在管理面板上使用FPFileWidget,请查看Django Admin: Using a custom widget for only one model field

    更改这两个设置应该适合您。

    【讨论】:

    • 谢谢!我已经解决了问题 1. 使用您的链接。将检查 django-storages
    • 如果您遇到任何其他困难,请告诉我。
    • 大家好,@psjinx 我有一个问题。我已经修改了我的 DEFAULT_STORAGE_BACKEND 但似乎文件已上传到 filepicker 然后 s3,在 filepicker 模式和表单提交上。有没有办法让文件选择器上的文件与我的模型的 FPFileField 相关联,而不是再次上传到 s3?提前致谢。
    • FPFileField 不存储 fpurl。
    • 请查看github.com/Filepicker/django-filepicker/blob/master/… URLFileMapperMiddleware 在request.FILES 中为您提供上传的文件,但您也可以在request.POST 中获得实际网址。
    【解决方案2】:

    看看 FPUrlField,它应该可以满足您的需求。当前的 FP*Fields 没有管理界面,但如果您想回馈代码,我们很乐意接受拉取请求

    【讨论】:

    • 谢谢布雷特。现在 FPFileField 的 url 字段指向filepicker.io/api/file/XXXXXXXX,虽然不指向 S3,但它比上传到 /media 的文件要好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2023-03-15
    相关资源
    最近更新 更多