【问题标题】:Django ImageField in forms not uploading, works from admin but not from form表单中的 Django ImageField 未上传,从管理员工作但不是从表单
【发布时间】:2017-09-18 15:49:12
【问题描述】:

所以,我有一个系统,用户可以从现有的图片库中进行选择,也可以上传要处理和保存的新图片。

首先,模型:

class Post(models.Model):
    image = models.ForeignKey(Image, null=True, blank=True)
    title = models.CharField(max_length=200)
    slug = models.CharField(max_length=200, unique=True, blank=True)
    description = models.TextField(blank = True)
    text = models.TextField()

    def __str__(self):
        return self.title

和我们的表格

class PostForm(BaseModelForm):
    new_image = forms.ImageField(required=False)

    def clean(self):

        return self.cleaned_data

class Meta:
    model = Post
    fields = ('title','text', 'image', 'new_image', description')

    help_texts = {
       'new_image': _('either upload a new image, or choose from the gallery')
    }

那么我们的视图处理它的位置

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.slug=slugify(post.title)
            if form.cleaned_data.get('new_image'):
                image = Image(title=post.title, description=post.description, image = request.FILES['new_image'])
                image.save()
                post.image = image


            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})

现在应该做的是从表单字段中创建一个新的图像对象,然后将其保存到 post 模型的外键约束中。但它的作用是什么,帖子上传正常,带有空白图像字段,并且永远不会创建图像。这让我认为“new_image”的 if 语句解析为 False,但我不知道为什么会这样做。

另外,为了约定,这应该发生在表单类还是视图类中?

还有,我的图像模型

class Image(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    image = models.ImageField(upload_to = 'images/', default =     'images/None/no-img.jpg')
    def __str__(self):
        return self.title

【问题讨论】:

    标签: django forms


    【解决方案1】:

    表单模板需要这个:enctype="multipart/form-data",我添加了它,突然我们有了功能图像处理!

    【讨论】:

    • 对于以后遇到这种情况的人,他指的是模板中的这一行:
    • 这救了我,每当有 ImageField/FileField 时,我们需要将此标签添加到表单 enctype="multipart/form-data"。谢谢!
    【解决方案2】:

    你需要改变

    form = PostForm(request.POST)
    

    到:

    form = PostForm(request.POST, request.FILES)
    

    您需要添加 request.FILES 才能按照文档上传文件

    Django Documentation: File Uploads

    当通过表单将帖子/图像保存到图像模型时,您可能希望使用保存前/保存后信号来创建新的图像保存。


    您需要将您的 Image 模型添加到此示例中。查看您如何通过表单保存图像信息,我假设您没有使用

    ImageField()
    

    您的图像模型上的模型。唯一的判断方法是您也展示该模型。

    Django Documentation: Model Field Reference: ImageField()

    这个字段是Django通过表单上传图片的方式。

    您可能需要在视图中添加两个表单,一个用于发布帖子,另一个用于上传新图片。

    我自己还在学习这个,所以你可以看看这里并找到一些帮助。

    【讨论】:

    • 这很有帮助!我已经在中添加了图像模型
    • 你能把我的帖子发上来吗?谢谢。
    • 我删除了我的其他帖子,因为它没有帮助,我不希望任何人使用它,因为它没有帮助。
    • 没关系,你很有帮助。我正在考虑实现一个 ImageForm,然后回到这个。
    • 嘿,如果您还在苦苦挣扎,请查看我发布的答案。祝你好运:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2019-09-25
    • 2018-05-26
    • 2019-04-25
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    相关资源
    最近更新 更多