表单中的 Django ImageField 未上传,从管理员工作但不从表单工作

标签 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 模型上的外键约束中。但它所做的是什么,帖子上传的很好,带有一个空白的图像字段,并且图像永远不会被创建。这让我觉得 'new_image' 的 if 语句解析为 False,但我不知道为什么会这样做。

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

另外,我的图像模型
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

最佳答案

你需要改变

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

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

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

关于表单中的 Django ImageField 未上传,从管理员工作但不从表单工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43546146/

相关文章:

python - 如何检查你的模型在 Django 中没有错误

python - django 中的 kwargs - 如何将 unique() 放入 kwargs

python - Django:尝试制作自定义表单时出现 RelatedObjectDoesNotExist 错误

javascript - 下拉列表不起作用?

javascript - 通过Javascript函数返回PHP数据,无需提交表单

javascript - 如何防止在 firefox 中的人工提交事件中提交表单(页面导航)?

存储日志的 Django Gunicorn

linux - cron 找不到 Django 管理命令

javascript - 弹出内容有时出现在主要内容后面

javascript - 在纯 JavaScript 中构建具有多个步骤的表单向导的最佳实践?