表格无法上传的Django ImageField,可以从管理员工作,但不能从表单

时间:2017-04-21 15:08:10

标签: django forms

所以,我有一个系统,用户可以从已经存在的图库中选择,或者上传要处理和保存的新图像。

首先,模特:

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模型的foreignkey约束。但它的作用是什么,帖子上传很好,空白的图像字段,图像永远不会被创建。这让我想到了' 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

2 个答案:

答案 0 :(得分:3)

您需要更改

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通过表单上传图像的方式。

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

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

答案 1 :(得分:3)

表单模板需要这个:enctype =" multipart / form-data",我补充说,突然间我们有功能图像处理!