【问题标题】:Field 'id' expected a number but got 'hellooo' - Django Blog Comments字段 'id' 需要一个数字,但得到了 'hellooo' - Django 博客评论
【发布时间】:2021-08-17 11:08:16
【问题描述】:

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

字段 '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 必须是一个数值
  • 我认为这可能是问题所在,但我不确定如何使那行代码工作。
  • 我尝试将其更改为以下内容:form.instance.post_id = self.kwargs['pk'] 但随后我得到了 'pk' 的 KeyError

标签: python django comments blogs


【解决方案1】:

正如您正确理解的那样,问题在于如何将值分配给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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2021-06-03
    • 2021-01-22
    相关资源
    最近更新 更多