首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用Django的cropperjs上传作物图像和格式

利用Django的cropperjs上传作物图像和格式
EN

Stack Overflow用户
提问于 2021-04-09 06:34:39
回答 1查看 589关注 0票数 1

我使用https://github.com/fengyuanchen/cropper/blob/master/README.md作为cropper函数。但是,我想提交字段对象(在本例中是标题)和裁剪的图像。但我在管理员上有个错误。当然,在运行服务器之前,我已经完成了makemigrationsmigrate

误差图

admin.py

代码语言:javascript
复制
from django.contrib import admin
from .models import Image
# Register your models here.
class ImageAdmin(admin.ModelAdmin):
    pass

admin.site.register(Image, ImageAdmin)

models.py

代码语言:javascript
复制
from django.db import models

# Create your models here.
class Image(models.Model):
    title = models.CharField(max_length=10)
    image = models.ImageField(upload_to='images')

    def __str__(self):
        return str(self.pk)

forms.py

代码语言:javascript
复制
from django import forms
from .models import Image

class ImageForm(forms.Form):
    image = forms.ImageField()
    title = forms.CharField(
        max_length=10, 
        widget=forms.TextInput(
            attrs={
                "class": "form-control", 
                "placeholder": "Title",
                }, 
                ),
                required=True
                )

views.py

代码语言:javascript
复制
from django.shortcuts import render, redirect

from .models import Image
from .forms import ImageForm
from django.http import JsonResponse
from django.http import HttpResponseRedirect



def main_view(request):

    form = ImageForm()


    if request.method == "POST":

        form = ImageForm(request.POST, request.FILES)
        if form.is_valid():

                addimage = Image(
                    title=form.cleaned_data['title'],
                    image = form.cleaned_data['image'], 
                )

                addimage.save()
    else:
        form = ImageForm()
    context = {'form': form}
    return render(request, 'photo_list.html', context)

photo_list.html

代码语言:javascript
复制
{% extends "base.html" %}

{% block javascript %}
<script>
  console.log("Hello");
  const imageBox = document.getElementById("image-box");
  const confirmButton = document.getElementById("confirm-button")
  const input = document.getElementById("id_image");
  const csrf = document.getElementsByName("csrfmiddlewaretoken")
  const imageForm = document.getElementById("image-form")

  input.addEventListener("change", () => {
    console.log("change")

    const img_data = input.files[0]
    const url = URL.createObjectURL(img_data)

    imageBox.innerHTML = `<img src="${url}" id="image" width="500px">`

    var $image = $('#image');

    $image.cropper({
      aspectRatio: 16 / 9,
      crop: function (event) {
        console.log(event.detail.x);
        console.log(event.detail.y);
        console.log(event.detail.width);
        console.log(event.detail.height);
        console.log(event.detail.rotate);
        console.log(event.detail.scaleX);
        console.log(event.detail.scaleY);
      }
    });

    // Get the Cropper.js instance after initialized
    var cropper = $image.data('cropper');

    confirmButton.addEventListener('click', () => {
      cropper.getCroppedCanvas().toBlob((blob) => {
        const fd = new FormData()
        fd.append('csrfmiddlewaretoken', csrf[0].value)
        fd.append('image', blob, 'my-image.png')
        console.log("append pass")


        $.ajax({
          type: "POST",
          url: imageForm.action,
          enctype: 'multipart/form-data',
          data: fd,
          success: function (response) {
            console.log(response)
          },
          error: function (error) {
            console.log(error)
          },
          cache: false,
          contentType: false,
          processData: false,
        })
      })
    })


  });
</script>
{% endblock %}

{% block page_content %}
<form action="/cropimage/" id="image-form" method="POST">
  {% csrf_token %}
  {{form}}
  {% comment %} <button class="btn" id="confirm-button"> confirm </button> {% endcomment %}
  <input class="btn btn-lg btn-primary btn-block" type="submit" value="Submit" id="confirm-button">
</form>
<div id="image-box" class="mb-3"> </div>

{% endblock %}

我遵循这个教程https://www.youtube.com/watch?v=oWd7SAuCIRM基本上,我正在制作一个用标题记录的图像相册,但这次是用cropperjs制作的。请提出任何解决办法或建议:)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-09 08:30:25

我真傻,在找了一个星期的解决方案之后,我终于意识到我没有放进去,在删除了一些数据库缓存之后。

fd.append('title', $("input[name='title']").val())

关于getCroppedCanvas()

对于那些有同样问题的人,请..。参考文献:

  1. 如何在FormData中为django附加更多数据?
  2. OperationalError,没有这样的专栏。姜戈
  3. https://developer.mozilla.org/en-US/docs/Web/API/FormData/append
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67016175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档