【问题标题】:How to display the uploaded image using Django and AJAX如何使用 Django 和 AJAX 显示上传的图像
【发布时间】:2019-10-29 16:45:54
【问题描述】:

我正在创建一个表单,允许用户选择图像并使用 Django 和 AJAX 上传它。这个过程工作正常,但问题是上传的图像没有显示在屏幕上,但我确实为它指定了div

这些是我遵循的步骤:

  • 创建处理上传图片的模型。
  • 为函数创建路径。
  • 创建上传所选图片的函数。
  • 创建模板和 AJAX 函数。

models.py:

class photo(models.Model):
    title = models.CharField(max_length=100)
    img = models.ImageField(upload_to = 'img/')

home.html:

 <form method="POST" id="ajax"  enctype="multipart/form-data">
        {% csrf_token %}
        Img:
        <br />
        <input type="file" name="img">

        <br />
        <br />
        <button id="submit"  type="submit">Add</button>

    </form>



<h1> test </h1>
    <div id="photo">
        <h2> {{ photo.title }}</h2>
        <img src="{{ photo.img.url }}" alt="{{ photo.title }}">
    </div>






 $('#ajax').submit(function(e) {
                e.preventDefault();
                var data = new FormData($('#ajax').get(0));
                console.log(data)

                $.ajax({
                    url: '/upload/', 
                    type: 'POST',
                    data: data,
                    contentType: 'multipart/form-data',
                    processData: false,
                    contentType: false,
                    success: function(data) {
                        // alert('gd job');
                        $("#photo").html('<h2> {{'+data.title+'}}</h2> <img src="{{'+data.img.url+ '}}" alt="{{ photo.title }}">')

                    }
                });
                return false;
            });

views.py:

def upload(request):
    if request.method == 'POST':
        if request.is_ajax():
            image = request.FILES.get('img')
            uploaded_image = photo(img = image)
            uploaded_image.save()
            photo=photo.objects.first()    

    # return render(request, 'home2.html')
    return HttpResponse(photo)

我期望用户上传图片和我存入数据库的图片后,图片一定要显示在屏幕上。

【问题讨论】:

  • 你正试图按照我那天建议的那样显示图像。在这里检查:stackoverflow.com/questions/56493419/…正确检查我的答案你犯了一个小错误
  • @chiragsoni 是的,你是对的,我尝试了你的答案,但它没有显示它,我也没有找到错误。但我怀疑错误出在 success 函数
  • 您正确地按照我的回答,您将能够解决它。祝你好运!
  • @chiragsoni 仍然没有找到错误的确切位置,因为当我调试它的工作时,它应该没有显示图像。
  • 兄弟我真的很抱歉,但通常情况下,只有当您欣赏他们的回答时,人们才会愿意回答和帮助您,对吧?我已经花时间在这里帮助你了:stackoverflow.com/questions/56493419/…,但你没有赞赏。请养成欣赏他人的习惯,以始终获得好的答案。这只是为了您的利益。

标签: javascript django django-models image-uploading


【解决方案1】:

要使用 ImageField,您必须安装 Pillow

pip install pillow

让我们检查一下您的代码并稍作修改。

models.py

from django.db import models


# Create your models here.
class Photo(models.Model):
    title = models.CharField(max_length=100)  # this field does not use in your project
    img = models.ImageField(upload_to='img/')

views.py 我将您的视图分成两个视图。

from django.shortcuts import render
from django.http import HttpResponse
from .models import *
import json


# Create your views here.
def home(request):
    return render(request, __package__+'/home.html', {})


def upload(request):
    if request.method == 'POST':
        if request.is_ajax():
            image = request.FILES.get('img')
            uploaded_image = Photo(img=image)
            uploaded_image.save()
            response_data = {
                'url': uploaded_image.img.url,
            }
    return HttpResponse(json.dumps(response_data))

urls.py

from django.urls import path
from .views import *
from django.conf.urls.static import static
from django.conf import settings

app_name = __package__

urlpatterns = [
    path('upload/', upload, name='upload'),
    path('', home, name='home'),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py

MEDIA_URL = '/img/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'img')

home.html

{% load static %}
<html>
    <head>
        <script src="{% static 'photo/jquery-3.4.1.js' %}"></script>
        <script>
            $(document).ready(function() {
                $('#ajax').submit(function(e) {
                    e.preventDefault();  // disables submit's default action
                    var data = new FormData($('#ajax').get(0));
                    console.log(data);

                    $.ajax({
                        url: '/upload/',
                        type: 'POST',
                        data: data,
                        processData: false,
                        contentType: false,
                        success: function(data) {
                            data = JSON.parse(data); // converts string of json to object
                            $('#photo').html('<img src="'+data.url+ '" />');
                            // <h2>title</h2> You do not use 'title' in your project !!
                            // alt=title see previous comment
                        }
                    });
                    return false;
                });
            });

        </script>    
    </head>
    <body>
        <form method="POST" id="ajax">
            {% csrf_token %}
            Img:
            <br />
            <input type="file" name="img" />
            <br />
            <br />
            <button id="submit"  type="submit">Add</button>
        </form>

        <h1> test </h1>
        <div id="photo"></div>
    </body>
</html>

不要在javascript中使用模板变量{{'+data.title+'}}! 向 HttpResponse() 发送一个字符串作为参数,在 return HttpResponse(photo) 中,照片是一个对象。

【讨论】:

  • 这是解决方案,谢谢。所以如果我想像相册一样上传几张照片,它的逻辑和过程是一样的吗?
  • 是的,您也可以在 html 表单和脚本中使用 'class' 而不是 'id'。类似$('.ajax').each(function () { $(this).submit( todo ); });
  • 这个答案很棒,谢谢 shmakovpn。我正在寻找这一行“ $('#photo').html('');”。你为我节省了很多精力。
【解决方案2】:

对于多种形式:

views.py

def home(request):
    context = {
        'range': range(3),
    }
    return render(request, __package__+'/home.html', context)

home.html

{% load staticfiles %}
<html>
    <head>
        <script src="{% static 'photo/jquery-3.4.1.js' %}"></script>
        <script>
            $(document).ready(function() {
                $('.ajax').each(function () {
                    $(this).submit(function (e) {
                        e.preventDefault();  // disables submit's default action
                        var data = new FormData($(this).get(0));
                        var imageForm = $(this);
                        $.ajax({
                            url: '/upload/',
                            type: 'POST',
                            data: data,
                            processData: false,
                            contentType: false,
                            success: function(data) {
                                data = JSON.parse(data); // converts string of json to object
                                imageForm.parent().find('.photo').html('<img src="'+data.url+ '" />');
                                console.log(imageForm);
                            }
                        });
                        return false;
                    });
                });
            });
        </script>
    </head>
    <body>
        {% for i in range %}
            <div style="border: 1px solid black">
                <form method="POST" class="ajax">
                    {% csrf_token %}
                    <div class="upload-label">Img-{{ i }}:</div>
                    <input type="file" name="img" />
                    <br />
                    <br />
                    <button class="submit"  type="submit">Add</button>
                </form>
                <div class="image-label"> Image: </div>
                <div class="photo">No image yet</div>
            </div>
        {% endfor %}
    </body>
</html>

【讨论】:

  • 它给了我Uncaught SyntaxError: Unexpected token p in JSON at position 0 错误。有什么想法吗?
猜你喜欢
  • 2019-10-22
  • 2011-08-11
  • 2018-02-06
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2014-11-29
相关资源
最近更新 更多