我在posts应用程序中有一个视图,我试图用标签保存一篇帖子。每当我在帖子中添加新标签时,我都会收到以下错误:创建时的值错误
我的观点是:
class PostCreateView(CreateView):
template_name = 'posts/create.html'
form_class = PostCreationForm
model = Post
def get_success_url(self):
return reverse('posts:detail', kwargs={"slug": self.object.slug})
def form_valid(self, form):
form.instance.user = self.request.user
form.save() # this is where the error occurs
tags = self.request.POST.get("tag").split(",")
for tag in tags:
current_tag = Tag.objects.filter(slug=slugify(tag))
if current_tag.count() < 1:
create_tag = Tag.objects.create(title=tag)
form.instance.tag.add(create_tag)
else:
existed_tag = Tag.objects.get(slug=slugify(tag))
form.instance.tag.add(existed_tag)
return super(PostCreateView, self).form_valid(form)
我使用的表格如下:
class PostCreationForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PostCreationForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_method = "post"
self.helper.field_class = 'form-group'
self.helper.layout = Layout(
Field('title', css_class="form-control", placeholder='Post title'),
Field('content', css_class="form-control", placeholder='Post content'),
Field('category', css_class="form-control"),
Field('image', css_class="form-control"),
Field('tag', css_class="form-control", placeholder='tag1, tag2')
)
self.helper.add_input(Submit('submit', 'Create New Post', css_class='btn btn-underline-primary'))
tag = forms.CharField()
class Meta:
model = Post
fields = ['title', 'content', 'category', 'image', 'tag']
这是Post模型:
class Post(models.Model):
title = models.CharField(max_length=150, unique=True)
content = RichTextUploadingField()
# content = models.TextField()
publish_date = models.DateTimeField(auto_now_add=True)
image = models.ImageField(blank=True, null=True, upload_to='uploads/')
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
slug = models.SlugField(default="slug", editable=False)
category = models.ForeignKey(Category, on_delete=models.CASCADE, default=1, related_name='posts')
tag = models.ManyToManyField(Tag, related_name='posts', blank=True)
slider_post = models.BooleanField(default=False)
hit = models.PositiveIntegerField(default=0)
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Post, self).save(*args, **kwargs)
def __str__(self):
return self.title
def post_tag(self):
return ', '.join(str(tag) for tag in self.tag.all())
def comment_count(self):
return self.comments.all().count()
如何修复此错误:;字段"id"应为数字,但实际为"t"(其中"t"是我的第一个标记的第一个字母:"test"。如果我使用另一个标记,则错误显示该单词的第一个字符(。
从fields = ['title', 'content', 'category', 'image', 'tag']
中删除字段tag
这样做的原因是,通过包含,Django会自动创建一个名为tag
的ModelMultipleChoiceField
。
但是,由于您是手动处理提取和保存标记(使用tags = self.request.POST.get("tag").split(",")
(,因此将其从Meta.fields
中排除可以保证Django不会也尝试处理此字段。
因此,另一个解决方案是让Django通过完全删除自定义save()
方法来处理tag
表单字段。