如何使用 Django 中的表单向模型添加多个类别?

问题描述 投票:0回答:1

我有一个名为 BlogPost 的模型和一个名为 Category 的模型,每个 BlogPost 可以有多个类别。从管理面板创建帖子时,我没有任何问题,但是当尝试实现创建 BlogPost 以便用户可以创建帖子的表单时,我收到错误:

Direct assignment to the forward side of a many-to-many set is prohibited. Use categories.set() instead.

我尝试阅读文档,但有些东西我不理解,因为它不起作用。

我的模型是这个;

class BlogPost(models.Model):
    title = models.CharField(max_length=250)
    content = models.TextField()
    post_author = models.CharField(max_length=30)
    creation_date = models.DateTimeField(auto_now_add=True)
    modification_date = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='blog/files/blog_images')
    categories = models.ManyToManyField('Category', related_name='posts') #Relaciona el atributo con la clase Category y permite usar category.posts

    def __str__(self):
        return self.title
    
    class Meta:
        verbose_name = "blog post"
        verbose_name_plural = "blog posts"

class Category(models.Model):
    cat_name = models.CharField(max_length=50)

    def __str__(self):
        return self.cat_name
    
    class Meta:
        verbose_name = "category"
        verbose_name_plural = "categories"

这是表格:

class newPostForm(forms.Form):

    CATEGORIES = (
        (1, "Agua dulce"),
        (2, "Agua marina"),
        (3, "Primer acuario"),
        (4, "Alimentación")
    )

    título = forms.CharField(max_length=250)
    contenido = forms.CharField(
        widget=forms.Textarea()
    )
    imagen = forms.ImageField()
    autor = forms.CharField()
    categorias = forms.ModelMultipleChoiceField(
        queryset=Category.objects.all(),
        widget=forms.CheckboxSelectMultiple
    )

这就是观点:

def new_post(request):
    if request.method == "POST":
        form = newPostForm(request.POST, request.FILES)
        if form.is_valid():
            
            info = form.cleaned_data

            new_post_info = BlogPost(
                title=info["título"],
                content=info["contenido"],
                image=info["imagen"],
                post_author=info["autor"],
                categories=info["categorias"]
                )

            new_post_info.save()   

            return redirect(request.path_info)
        
    else:
        form = newPostForm()
    
    return render(request, "blog/new_post.html", {"form":form})

欢迎任何建议!

我之前尝试过保存并添加文档中所述的类别,但没有成功。

django django-models django-views django-forms
1个回答
0
投票

我解决了,这就是任何想知道的人的方法:

将视图修改为:

def new_post(request):
if request.method == "POST":
    form = newPostForm(request.POST, request.FILES)
    if form.is_valid():
        
        info = form.cleaned_data

        new_post_info = BlogPost(
            title=info["título"],
            content=info["contenido"],
            image=info["imagen"],
            post_author=info["autor"],
            )

        new_post_info.save()  
        new_post_info.categories.set(info["categorias"])

        return redirect(request.path_info)
    
else:
    form = newPostForm()

return render(request, "blog/new_post.html", {"form":form})

现在,它会在保存 new_post_info 对象后,将存储在表单“categorias”字段中的内容传递给 BlogPost 对象属性类别。

PD:我不知道回答自己的问题是否是一种习惯,但这可能会对将来的某人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.