Невозможно добавить поля ManyToManyFields с помощью froms.py в django
Я пытаюсь добавить данные в модель с помощью django forms, но получаю
Прямое присвоение прямой стороне множества "многие-ко-многим" запрещено. Вместо этого используйте tag.set().. Пожалуйста, помогите мне решить эту проблему. Я использую поле multiselect для отправки данных в views.py.
models.py
class Tags(models.Model):
tag = models.CharField(max_length=100)
def __str__(self):
return self.tag
class Meta:
verbose_name_plural = 'Tags'
class Post(models.Model):
...
author = models.ForeignKey(User, verbose_name='Author', on_delete=models.CASCADE)
feature_image = models.ImageField(upload_to='blog/', verbose_name='Add Feature Image')
tag = models.ManyToManyField(Tags, related_name='post_tags', verbose_name='Add Tags')
def __str__(self):
return self.title
forms.py
class PostForm(forms.ModelForm):
...
class Meta:
model = models.Post
fields = [...]
просмотров
def adminNewPostView(request):
form = forms.PostForm()
if request.method == 'POST':
...
tags = request.POST.getlist('tagName')
form = forms.PostForm(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.category = cat
if subcat:
post.sub_categories = subcat
if subfil:
post.filter_option = subfil
add_tags = models.Tags.objects.filter(tag__in=tags)
for tl in add_tags:
post.tag = tl # Getting Error here
post.save()
return HttpResponseRedirect(reverse('blog_app:index'))
Ошибка
Прямое присвоение прямой стороне множества "многие-ко-многим" запрещено. Вместо этого используйте tag.set().
views.py
def adminNewPostView(request):
form = forms.PostForm()
if request.method == 'POST':
...
tags = request.POST.getlist('tagName')
form = forms.PostForm(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.category = cat
if subcat:
post.sub_categories = subcat
if subfil:
post.filter_option = subfil
post.save()
add_tags = models.Tags.objects.filter(tag__in=tags)
for tl in add_tags:
post.tag.add(tl) # new
return HttpResponseRedirect(reverse('blog_app:index'))
чтобы узнать больше об этом, пожалуйста, обратитесь к https://docs.djangoproject.com/en/dev/ref/models/relations/
или сюда https://docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/#many-to-many-relationships
.
есть и другой способ сделать это. вот так
def adminNewPostView(request):
form = forms.PostForm()
if request.method == 'POST':
...
tags = request.POST.getlist('tagName')
form = forms.PostForm(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.category = cat
if subcat:
post.sub_categories = subcat
if subfil:
post.filter_option = subfil
post.save()
add_tags = models.Tags.objects.filter(tag__in=tags)
post.tag.add(*add_tags) # new
return HttpResponseRedirect(reverse('blog_app:index'))
Форма Django может сама обрабатывать ManyToManyField
, но может делать это только с .save_m2m()
или .save()
без использования commit=False
: сначала ей нужно сохранить объект Post
, поскольку ей нужен первичный ключ этого объекта Post
, чтобы связать объект с другими элементами.
Если ваше PostForm
использует поле tag
:
class PostForm(forms.ModelForm):
…
class Meta:
model = models.Post
# ↓ tag field
fields = ['tag', 'other', 'fields']
тогда мы можем позволить форме сделать работу за нас:
from django.shortcuts import redirect
def adminNewPostView(request):
form = forms.PostForm()
if request.method == 'POST':
…
tags = request.POST.getlist('tagName')
form = forms.PostForm(request.POST, request.FILES)
if form.is_valid():
if subcat:
form.instance.sub_categories = subcat
if subfil:
form.instance.filter_option = subfil
form.instance.author = request.user
form.instance.category = cat
form.save()
return redirect('blog_app:index')