【问题标题】:My Django image cant upload when i tried to update it当我尝试更新时,我的 Django 图像无法上传
【发布时间】:2019-03-28 16:49:25
【问题描述】:

我正在用 django 建立一个博客,我成功创建了一个新帖子,但是当我尝试更新帖子时,所有内容都已更新但图像没有更新,它没有将图像上传到帖子模型中的 upload_to

这是我的代码

view.py

@login_required
def UpdatePost(request, pk):
    obj = get_object_or_404(Posts, id=pk)
    myForm = NewPostForm(instance = obj)
    if request.method == 'POST':
        myForm = NewPostForm(request.POST, request.FILES, instance=request.user.profile)
        response_data = {
            'SType': 'danger',
            'message': "An Error Occured, pls try again later"
        }
        title = request.POST.get('title')
        content = request.POST.get('content')
        category_id = request.POST.get('category')
        image = request.FILES.get('image') 
        if myForm.is_valid():
            if Posts.objects.filter(pk=pk).update(title=title, content=content, image=image, category_id=category_id, author_id=request.user.id):
                response_data = {
                    'SType': 'success',
                    'message': "Saved Successfully"
                } 
        return HttpResponse(json.dumps(response_data), content_type="application/json")
    context={ 
        'form':myForm,
        'title': obj.title,
        'category': Category.objects.all()
    }
    return render(request, 'blog/update.html', context) 

更新.html

<form action="." method="POST" enctype="multipart/form-data" id="PostNew__form"> {% csrf_token %}
    <fieldset class="form-group">
        <legend class="border-bottom mb-4">Update a Blog Post</legend>
        <div class="form-row">
            <div class="form-group col-md-8 mb-0">
                {{ form.title | as_crispy_field }}
            </div>
            <div class="form-group col-md-4 mb-0">
                {{ form.category | as_crispy_field }}
            </div>                
        </div>
        {{ form.content | as_crispy_field }}
        <div class="">
            {{ form.image | as_crispy_field }}
        </div>

    </fieldset>
    <div class="form-group">
        <h6 id="PostNew__show" ></h6>
        <img src=" {% static 'images/ajax-loader.gif' %}" style="Display:none;" id="PostNew__img">
        <button class="btn btn-outline-info float-right" type="submit" id="PostNew__submit">Update</button>
    </div>
</form>

模型.py

class Posts(models.Model):
    title = models.CharField(max_length=100)
    category = models.ForeignKey(Category, default="1", on_delete=models.CASCADE)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='blog_pics')

    def __str__(self):
        return self.title

forms.py

class NewPostForm(forms.ModelForm):    
    class Meta:
        model = Posts
        fields = ['title', 'category', 'content', 'image']

请问我该如何解决这个问题,在数据库中,它存储文件名但它只是名称,没有upload_to文件夹

【问题讨论】:

  • 如果您使用的是ModelForm,为什么不直接保存表单而不是使用update()? (您通常也不应该将request.POST[field] 保存到您的模型中,而是保存form.cleaned_data[field],因为这样很安全。)
  • 您的表单初始化错误:使用instance=obj 而不是instance=request.user.profile
  • 是的,我试过了,但没用
  • 那是因为您将错误的实例传递给表单

标签: python django python-3.x


【解决方案1】:

在 Django 文档中,它展示了如何通过创建 Model 实例将文件上传到 Model。查询集上的update() 方法不做同样的事情,它可以快捷地分配字段以执行数据库查询。所以它实际上不会将图像文件保存到存储中。

您应该在保存之前直接分配实例的文件字段,或者您应该只保存表单。而且您不必查询数据库,因为您已经拥有传递给表单的实例。所以要么这样做:

obj.image = image
obj.title = form.cleaned_data['title']
...
obj.save()

或者,由于您已经有一个 ModelForm,您可以这样做:

form.save()

但是请注意,您实例化表单的代码是错误的:

form = NewPostForm(request.POST, request.FILES, instance=obj)  # not request.user.profile 

如果表单因为您的模型需要不属于表单的字段而无法直接保存,那么您应该使用commit=False

post = form.save(commit=False)
post.author = request.user  # and assign other fields that are not part of the form
post.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多