当我试图用标签保存帖子时,Djang3.1出现错误



我在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会自动创建一个名为tagModelMultipleChoiceField

但是,由于您是手动处理提取和保存标记(使用tags = self.request.POST.get("tag").split(",")(,因此将其从Meta.fields中排除可以保证Django不会尝试处理此字段。

因此,另一个解决方案是让Django通过完全删除自定义save()方法来处理tag表单字段。

最新更新