Как добавить несколько категорий в модель с помощью формы в Django?
У меня есть модель под названием 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})
Любые предложения приветствуются!
Я пробовал сохранять до и добавлять категории, как описано в документации, но это не сработало.
Я решил эту проблему, вот как, если кому интересно:
Измените вид на:
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" формы, и передает это в атрибут categories объекта BlogPost.
PD: Не знаю, принято ли отвечать на собственный вопрос, но это может помочь кому-то в будущем.