Django 和 Dropzone.js 方法,创建带有图像的实例

Django and Dropzone.js methodology, creating an instance with images

我有 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. 先创建listings,添加第二步添加listings到created 型号
  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.

添加图像时,列表尚未创建

我会提出我的解决方案,我已经在我的项目中实施了并且效果很好。

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

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

希望,这有帮助