表单中的Django ImageField无法上传,只能通过管理员使用,而不能通过表单使用

Owe*_*oco 4 forms django

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

首先,模型:

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
Run Code Online (Sandbox Code Playgroud)

和我们的表格

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')
    }
Run Code Online (Sandbox Code Playgroud)

那么我们来看它在哪里处理

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})
Run Code Online (Sandbox Code Playgroud)

现在,应该做的是在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
Run Code Online (Sandbox Code Playgroud)

Owe*_*oco 7

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


Cor*_*mbs 6

你需要改变

form = PostForm(request.POST)
Run Code Online (Sandbox Code Playgroud)

至:

form = PostForm(request.POST, request.FILES)
Run Code Online (Sandbox Code Playgroud)

您需要添加request.FILES以便根据文档上载文件

Django文档:文件上传

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


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

ImageField()
Run Code Online (Sandbox Code Playgroud)

您的图像模型上的模型。唯一可以告诉您的方法就是显示该模型。

Django文档:模型字段参考:ImageField()

该字段是Django通过表单上传图像的方式。

您可能需要在视图中添加两种形式,一种形式用于发布信息,另一种形式用于上传新图像。

我自己仍在学习此技巧,因此您可以在这里查看并找到一些帮助。