大家好,我是Django的新手,头发拉扯了,快秃顶了。谁能帮我一下吗。
我正在尝试将多个图像添加到我的帖子中,但我遇到了问题。我有两个模型。一个帖子模型和一个图片模型。我的帖子模型已经有1个imagefield。然后我有另一个相关的模型,它允许多个图像。下面是我的模型的样子
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
title = models.CharField(max_length=250, unique=True)
slug = models.SlugField(allow_unicode=True, unique=True)
message = models.TextField()
post_image = models.ImageField()
class Image (models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
image = models.ImageField(upload_to='images/', blank=True, null=True)
image_title = models.CharField(max_length=100)
image_description = models.CharField(max_length=250)
def __str__(self):
return self.post.title + " Image"
下面是我的观点。当窗体加载时。它有多个图像字段。只是在我的帖子创建时没有保存这些图片。我收到一篇帖子,完全忽略了表单集和多个图像。它仅显示后模型方面和后模型的1个图像。即使在管理中也没有多个图像。
有人能告诉我代码中的错误是什么吗?
视图。py第一次尝试
@login_required
def post_create(request):
ImageFormset = modelformset_factory(Image, fields=('image', 'image_title', 'image_description'), extra=7)
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
formset = ImageFormset(request.POST or None, request.FILES or None)
if form.is_valid() and formset.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
for f in formset:
try:
photo = Image(post=post, image=f.cleaned_data['image', 'image_title', 'image_description'])
photo.save()
return redirect('posts:single', username=request.user.username, slug=post.slug)
except Exception as e:
break
else:
form = PostForm()
formset = ImageFormset(queryset=Image.objects.none())
context = {'form': form, 'formset': formset}
return render(request, 'posts/post_form.html', context)
下面是我的表格。py公司
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'message', 'post_image' )
更改了user3054319建议的视图,请参见下文。它工作正常,但在图像文件夹中仅保存1个图像。一切正常吗我的缩进
视图。py第二次尝试
@login_required
def post_create(request):
ImageFormset = modelformset_factory(Prep, fields=('image', 'image_title', 'image_description'), extra=7)
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
formset = ImageFormset(request.POST or None, request.FILES or None)
if form.is_valid() and formset.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
for f in formset:
try:
photo = Prep(post=post, image=f.cleaned_data['image'], image_title=f.cleaned_data['image_title'],
image_description=f.cleaned_data'image_description'])
photo.save()
return redirect('posts:single', username=request.user.username, slug=post.slug)
except Exception as e:
break
然后,我尝试删除try和except语句,并在循环外部获取重定向
它保存所有7幅图像
但最后给出了一个错误(见下面的错误图片)
视图。py第三次尝试
@login_required
def post_create(request):
ImageFormset = modelformset_factory(Prep, fields=('image', 'image_title', 'image_description'), extra=7)
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
formset = ImageFormset(request.POST or None, request.FILES or None)
if form.is_valid() and formset.is_valid():
post = form.save(commit=False)
post.user = request.user
post.save()
for f in formset:
photo = Prep(post=post, image=f.cleaned_data['image'], image_title=f.cleaned_data['image_title'], image_description=f.cleaned_data['image_description'])
photo.save()
return redirect('posts:single', username=request.user.username, slug=post.slug)
下面的错误图像
如果这可以通过CBV实现,我可以添加一段我跳舞的视频,就像我中了彩票一样。但我不会太贪心,即使解决这个问题也能帮我省点麻烦