代码之家  ›  专栏  ›  技术社区  ›  Samir Tendulkar

使用FBV对多个图像进行后期创建

  •  0
  • Samir Tendulkar  · 技术社区  · 6 年前

    大家好,我是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): #(Images)
        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() ## It seems as if my code just plays till here and then disconnects
                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: ## This part works too as it shows the correct empty form
            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实现,我可以添加一段我跳舞的视频,就像我中了彩票一样。但我不会太贪心,即使解决这个问题也能帮我省点麻烦 Error I get on 3rd try

    2 回复  |  直到 6 年前
        1
  •  1
  •   user3054319    6 年前

    我查看了您的post create视图,发现您试图通过一个调用访问字典的多个键,该调用是f.cleaned\u data[image,image\u title],这在语法上是错误的

    如果您打印(f.cleaned\u数据),它将提供字典,您应该知道如何访问字典。

    您必须使用

    照片=图像(post=post,Image=f.cleaned\u data['Image',Image\u title=f.cleaned\u data['Image\u title'))

        2
  •  0
  •   Samir Tendulkar    6 年前

    以下是正确的 视图。py公司 感谢用户3054319

    def post_create(request):
        ImageFormSet = modelformset_factory(Images, fields=('image','image_title', 'image_description'), extra=7)
        if request.method == "POST":
            form = PostCreateForm(request.POST or None)
            formset = ImageFormSet(request.POST or None, request.FILES or None)
            if form.is_valid() and formset.is_valid():
                instance = form.save(commit=False)
                instance.author = request.user
                instance.save()
                print(formset.cleaned_data)
                for f in formset.cleaned_data:
                    try:
                        photo = Images(post=instance, image=f['image'], image_title=f['image_title'], image_description=f['image_description'])
                        photo.save()
                    except Exception as e:
                        break
                return redirect('posts:single', username=instance.user.username, slug=instance.slug)
        else:
            form = PostCreateForm()
            formset = ImageFormSet(queryset=Images.objects.none())
        context = {
            'form': form,
            'formset': formset,
        }
        return render(request, 'blog/post_create.html', context)