字段 'id' 需要一个数字但得到了 'hellooo' - Django 博客评论

Field 'id' expected a number but got 'hellooo' - Django Blog Comments

我正在尝试在我的博客上添加评论,但是当我尝试提交评论时出现以下错误:

"字段 'id' 需要一个数字但得到了 'hellooo'."

Views.py:

class AddComment(generic.CreateView):
    model = Comment
    form_class = AddComment
    template_name = 'add_comment.html'

    def form_valid(self, form):
        form.instance.post_id = self.kwargs['slug']
        return super().form_valid(form)

    success_url = reverse_lazy('blog')

forms.py:

class AddComment(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'body')

        widgets = {
            'Name': forms.TextInput(attrs={'class': 'form-control'}),
            'body': forms.Textarea(attrs={'class': 'form-control'}),
        }

models.py:

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete= models.CASCADE, related_name='comments')
    name = models.CharField(max_length=255)
    body = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '%s - %s' % (self.post.title, self.name)

urls.py:

from . import views
from django.urls import path

urlpatterns = [
    path('', views.PostList.as_view(), name='blog'),
    path('add_post/', views.AddPost.as_view(), name='add_post'),
    path('edit_post/<slug:slug>/', views.EditPost.as_view(), name='edit_post'),
    path('delete_post/<slug:slug>/', views.DeletePost.as_view(), name='delete_post'),
    path('<slug:slug>/comment/', views.AddComment.as_view(), name='add_comment'),
    path('<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
]

如您所想,问题在于如何将值分配给 form.instance.post_id

Comment模型的post字段应该是一个对象。您也可以使用 post_id,然后它需要是一个整数。你给它分配了一个字符串(slug),这在任何一种情况下都不起作用。

由于您只有 slug,因此在将其分配给字段之前,您应该获取 Post 对象或其 ID。

class AddComment(generic.CreateView):
    model = Comment
    form_class = AddComment
    template_name = 'add_comment.html'

    def form_valid(self, form):
        # Get the slug
        slug = self.kwargs['slug']
        # Assign as an object
        form.instance.post = Post.objects.get(slug=slug)
        # Or assign as an integer id
        # form.instance.post_id = Post.objects.get(slug=slug).pk
        return super().form_valid(form)

    success_url = reverse_lazy('blog')