【问题标题】:Django and Dropzone.js methodology, creating an instance with imagesDjango 和 Dropzone.js 方法,使用图像创建实例
【发布时间】:2018-06-05 15:41:53
【问题描述】:

我有 2 个模型 ListingImage,其中一个列表可以有多个图像。

class Listing(models.Model):
    title = models.CharField(max_length=100, blank=False)

class ListingImage(models.Model):
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField(blank=True)

理想情况下,我想在单个页面上创建此类列表,例如填写所有表单信息并在同一页面上添加图像。

这似乎是不可能的(如果可以的话,请告诉我,但请注意 dropzone.js 是 Ajax)用一个视图处理 2 个表单,我已经做了以下解决方法:

  1. 首先创建列表,添加第二步将列表添加到已创建 型号
  2. 创建一个占位符列表,向其中添加图像(通过 Ajax) 并在提交表单时更改占位符信息。

哪种方法更好?

views.py

def add_image(request):
# process images: problem we have no listing_instance to add them to
    if request.method == 'POST':
        form = ListingImageForm(request.POST, request.FILES)
        if form.is_valid():
            ListingImage.objects.create(pk=None, listing=listing_instance)

            return HttpResponse(
                json.dumps({
                    "result": True,
                }),
                content_type="application/json"
            )

我正在寻找方法方面的建议。例如,要创建带有图像的列表,我需要先创建列表然后添加图像(2个步骤)还是先添加图像和列表信息?我的问题是,如果我这样做,当我使用 Ajax 添加图像时,列表尚未创建。

【问题讨论】:

标签: python django dropzone.js


【解决方案1】:

我将提出我已在我的项目中实施的解决方案,并且工作起来就像一个魅力。

  1. 表单已渲染,dropzone.js 已初始化
  2. 图像被提交并上传到定义的端点(url),这里django视图保存上传的文件(作为模型),返回保存的图像pk(或其他唯一标识符)。
  3. 客户端前端接收保存的图像pk 并使用某种协议(例如pk1::pk2::pk3)存储在隐藏输入中(例如名为images
  4. 一旦提交表单,django 表单验证通过,您正在使用图像 pks 处理输入值并从 db 获取条目: images = ListingImage.objects.filter(pk__in=request.POST.get('images').split('::'))
    我强烈建议对 images 值应用更多验证 此查询将为您提供所有用户上传的提交表单的图像,最后您将更新 ListingImage 条目以链接 Listing 条目 images.update(listing=newly_created_listing_entry)

另外,为了避免数据库膨胀,我每 1 天运行一次 cron 作业来清理未链接到任何表单的图像(以防用户放弃表单提交)

希望,这会有所帮助

【讨论】:

  • 这是完美的 :) 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 2011-01-28
相关资源
最近更新 更多