gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:42:13 24 4
gpt4 key购买 nike

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

先说模型:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com