如何将图像上传到 Django

Posted

技术标签:

【中文标题】如何将图像上传到 Django【英文标题】:How to Upload an Image to Django 【发布时间】:2020-09-16 14:46:13 【问题描述】:

我在这上面花了三天多的时间。似乎有些东西保存到了数据库中,但是当我尝试在模板中访问它时,我只能获取数据库的对象。我无法访问它。我相信它没有成功保存,因为我没有看到将保存它的媒体文件夹。这是我目前所拥有的。

# settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), )
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/media/' 
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# forms.py
from .models import Pic
from django import forms
class ImageForm(forms.ModelForm):
    class Meta:
        model= Pic
        fields= ["picture"]
# models.py
class Pic(models.Model):
    picture = models.ImageField(upload_to = 'media/', default = 'media/None/no-img.jpg', null=True, blank= True)
# views.py
def upload(request):
    form = ImageForm
    context = 
    userBio = Bio.objects.get(userData = User.objects.get(id = request.session['client']['id']))
    if request.method == 'POST':
        # .is_valid checks the models parameters via forms method
        form = ImageForm(request.POST,request.FILES)
        if form.is_valid():
            form.save()
            print("succesful uploaded image")
            return redirect("/dashboard")
        else:
            print("Not a valid input from form....")
            messages.error(request,"Not a valid input")
    return redirect("/dashboard")
<!-- dashboard.html -->
<form rule="form" class="border border--secondary" method="POST" action="/manageFile" enctype="multipart/form-data">
    % csrf_token%
    <input type="file" name = "update">
    <input type = "submit">
</form>
% if pictures %
    % for pic in pictures%
        <img src="pic" >
    % endfor %
% endif%

在模板中,它显示为 Pic 对象(1)。 在终端中,它显示为

查询集Pic:Pic对象(1)

这是我渲染到模板的内容。

def dash(request):
    try:
        _id = request.session['client']['id']
    except:
        return redirect("/loginPg")

    userBio = Bio.objects.get(userData = User.objects.get(id = request.session['client']['id']))
    print("its right here")
    theUploads = Pic.objects.all()
    print("This image object -", theUploads)

    content = 
        "title" : userBio.title,
        "qA" : userBio.quoteA,
        "qB" : userBio.quoteB,
        "desc" : userBio.desc,
        "authorA" : userBio.authorA,
        "authorB" : userBio.authorB,
        "pictures" : theUploads
    

    return render(request, "GoEnigma/dashboard.html", content)
# urls.py
from django.conf.urls.static import static
from django.conf import settings
# urls []
if settings.DEBUG:
     urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

【问题讨论】:

似乎只保存了模型参数的默认值。这是我在模板中看到的。 /media/media/None/no-img.jpg 如果upload 是Pic 模型的方法,那么站点将无法启动,因为循环导入。我认为上传是在views.py 中?而且你也错过了一个 return 声明。 上传请求方法在views.py中。如果表单有效,我将返回重定向。有趣的是,模型中的默认值是唯一被保存的东西。到目前为止,我有两个相同的网址。看起来像这样。 /media/media/None/no-img.jpg &lt;input type="file" name = "update"&gt; 是任意的,输入相同的字段名称:picture 而不是update 【参考方案1】:

ImageForm后面加括号,如果是Post请求,则在ImageForm中加上request.POST。


def upload:
  form = ImageForm()
  if request.method == 'POST':
    # .is_valid checks the models parameters via forms method
    form = ImageForm(request.POST, request.FILES)
    if form.is_valid():
        form.save()
        print("succesful uploaded image")
        return redirect("/dashboard")
    else:
        print("Not a valid input from form....")
        messages.error(request,"Not a valid input")
return redirect("/dashboard")

还要检查您是否没有添加用于提供媒体文件的 url 路径 所以在main projecturls.py 文件中添加以下这些行。

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
  # ..... all regular paths
] 
if setting.DEBUG: # if true
  urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

查看官方文档here

【讨论】:

我有,不幸的是同样的问题。 @Anthony 我已经更新了答案检查您是否为媒体文件添加了 urlspattens。 对不起,我忘了补充。我已经为媒体文件准备好了。 我已经有了,抱歉我忘了把它添加到我的问题中。我刚刚编辑了问题。【参考方案2】:

如果将图片保存在数据库中,则错误在于渲染模板。要在模板中呈现图像,您需要获取 model_class.model_fields.url 所以在您的情况下,类是图片,字段是图片。 在你的模板中试试这个&lt;img src="pic.picture.url"&gt;

【讨论】:

网址正在显示。显示的唯一 url 来自模型中的默认值。我在模型中有两个 url,看起来像这样 /media/media/None/no-img.jpg 尝试在模板本身中渲染默认图片。例如:如果图片不是显示图片,则获取默认图片 @Anthony 请更新你的模板代码,@ngawang13 是对的,如果有 Pic 实例(显示Pic object (1)),则模板错误,应该显示 url。如果 url 总是显示你的默认值,那么保存也有问题。请务必输入您的实际代码。 图片是否保存在数据库中并尝试删除if语句并加载模板【参考方案3】:

这很难发现,因为您自己渲染表单域:

class ImageForm(forms.ModelForm):
    class Meta:
        model= Pic
        fields= ["picture"]
    <input type="file" name = "update">

所以文件字段的名称是更新,而不是图片。将其更改为图片,它应该可以工作,尽管使用 django 呈现表单要好得多,因此您不会出现这样的错误,并且对表单的更改会传播到 html。

【讨论】:

我使用表单来使用 .is_valid。但我可能不得不重新考虑它。谢谢。

以上是关于如何将图像上传到 Django的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react 中使用 graphene-django 和 axios 将图像上传到我的服务器?

如何将图像上传的标题更改为 django 类中的名称

如何将文件从 Axios 上传到 Django?

如何在 django 中将图像添加到帖子中

[Django] [channels] [python]如何上传静态文件(图像,文档)?

如何在 django 管理中将多个图像上传与 UPLOADIFY 集成?