无法在 Django 中使用 froms.py 添加 ManyToManyFields
Can not add ManyToManyFields using froms.py in django
我正在尝试使用 Django 表单在模型中添加数据,但得到
禁止直接赋值给多对多集合的前向。请改用 tag.set()。
请帮我解决这个问题。我正在使用多选字段将数据发送到 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/
or here https://docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/#many-to-many-relationships
还有另一种方法 it.like this
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
s,但只能使用 .save_m2m()
或 .save()
而不使用 使用 [=13] =]:首先它需要保存 Post
对象,因为它需要那个 Post
对象的主键到 link 对象到其他项目。
如果您的 PostForm
使用 tag
字段:
class PostForm(forms.ModelForm):
…
class Meta:
model = models.Post
# ↓ tag field
fields = ['tag', '<em>other</em>', '<em>fields'</em>]
然后我们可以让表单为我们完成工作:
从django.shortcuts导入重定向
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
<strong>form.save()</strong>
return redirect('blog_app:index')
我正在尝试使用 Django 表单在模型中添加数据,但得到
禁止直接赋值给多对多集合的前向。请改用 tag.set()。 请帮我解决这个问题。我正在使用多选字段将数据发送到 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/
or here https://docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/#many-to-many-relationships
还有另一种方法 it.like this
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
s,但只能使用 .save_m2m()
或 .save()
而不使用 使用 [=13] =]:首先它需要保存 Post
对象,因为它需要那个 Post
对象的主键到 link 对象到其他项目。
如果您的 PostForm
使用 tag
字段:
class PostForm(forms.ModelForm):
…
class Meta:
model = models.Post
# ↓ tag field
fields = ['tag', '<em>other</em>', '<em>fields'</em>]
然后我们可以让表单为我们完成工作:
从django.shortcuts导入重定向
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
<strong>form.save()</strong>
return redirect('blog_app:index')