Django 提交文件表单不会通过前端保存到模型

时间:2021-08-01 23:30:49

标签: python django django-models django-views django-forms

所以目标是让用户在应用程序内上传图片,并让图片显示在屏幕上。

问题是表格无法保存到我制作的模型中。我正在关注 Django Central https://djangocentral.com/uploading-images-with-django/ 以获取有关上传我的图像的指导。

我目前所拥有的是用户可以在表单内输入标题以及用户可以为他们的图像选择文件的位置,但是当他们单击上传按钮时没有任何反应。发生的所有事情是它出于某种原因将我重定向到主页,但我可以稍后修复它。在网站上显示图像的唯一方法是我手动进入管理面板并将图像上传到那里。如果有人可以提供帮助,我将不胜感激。

view.py

def profile(request):
    if request.method == "POST":
        form = User_Profile_Form(data = request.POST, files = request.FILES)
        if form.is_valid():
            form.save()
            obj = form.instance
            return render(request, "main/profile.html", {"obj":obj})
    else:
        form = User_Profile_Form()
    img = User_Profile.objects.all()
    return render(request,"main/profile.html", {"img":img, "form":form})

models.py

class User_Profile(models.Model):
    caption = models.CharField(max_length = 100)
    image = models.ImageField(upload_to = "img/%y", blank=True)

    def __str__(self):
        return self.caption

forms.py

from django import forms
from .models import User_Profile

class User_Profile_Form(forms.ModelForm):
    class Meta:
        model = User_Profile
        fields = ("caption", "image")

profile.html

                <div class="container">
                    <form action="." method="post" enctype="multipart/form-data">
                        {% csrf_token %}
                        {{form.as_p}}
                        <button type="submit" class="btn btn-lg btn-success">Upload</button>
                    </form>

                    {% if obj %}
                    <h3>Succesfully uploaded : {{img_obj.caption}}</h3>
                    <img src="{{ obj.image.url}}" alt="image" class="img-thumbnail" >
                    {% endif %}
                    <hr>


                    {% for x in img %}
                    {% if forloop.first %}<div class="row ">{% endif %}
                        <div class="col-lg-4 col-md-4 col-12" >
                    <div class="text-center mt-2">
                        <img src="{{x.image.url}}" height="70%" width="70%" class="img-thumbnail" alt="...">
                        <h2 class="text-center" >{{x.caption}}</h2></div>
                        </div>
                        {% if forloop.counter|divisibleby:3 %}
                    </div>
                    <div class=row>{% endif %}
                        {% if forloop.last %}</div>{% endif %}

                    {% endfor %}
                </div>

2 个答案:

答案 0 :(得分:2)

在模板中更改操作: 来自:

<form action="." method="post" enctype="multipart/form-data">

致:

<form action="" method="post" enctype="multipart/form-data">

. 将您重定向到主页。

views.py

def profile(request):
    if request.method == "POST":
        form = User_Profile_Form(data = request.POST, files = request.FILES)
        if form.is_valid():
            form.save()
            obj = form.instance
            return render(request, "main/profile.html", {"obj":obj, "form":form})
    else:
        form = User_Profile_Form()
    img = User_Profile.objects.all()
    return render(request,"main/profile.html", {"img":img, "form":form})

答案 1 :(得分:1)

我知道你想做什么,我在我的项目中做到了,这是我的代码,为你自己编辑

views.py

pimageupdate = ProfileImageUpdate(request.POST,request.FILES, instance=request.user.userprofile)
        if pimageupdate.is_valid():
            pimageupdate.save()

我是否应该注意到 pimageupdate 正在从 forms.py 获取表单

并且您应该像这样在 {{}} 代码中添加用户

{{user.userprofile.default_profile_picture}}

将表单标签中的“post”更改为“POST”

希望这项工作有效,如果您尝试过请告诉我