Django:我不知道如何保存模型

Django: I can't figure out how to save the model

我正在学习 Django。而且2个小时我不明白错误是什么。

模特博客

class Blog(models.Model):
    title = models.CharField(max_length=255, verbose_name='Заголовок')
    text = RichTextField(verbose_name='Текст')
    date = models.DateField(auto_now_add=True, verbose_name='Дата')
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Автор')
    image = models.ImageField(verbose_name='Фото', upload_to='blog')
    tags = models.CharField(max_length=500, verbose_name='Теги', help_text='через кому')
    slug = AutoSlugField(populate_from='title', null=True)

    class Meta:
        verbose_name = 'Стаття'
        verbose_name_plural = 'Статті'

    def __str__(self):
        return self.title

型号评论

class Comment(models.Model):
    name = models.CharField(max_length=100, verbose_name='Ім\'я')
    email = models.EmailField(verbose_name='Email', max_length=255)
    text = models.CharField(max_length=500, verbose_name='Коментар')
    datetime = models.DateTimeField(auto_now_add=True)
    article = models.ForeignKey(Blog, on_delete=models.CASCADE, verbose_name='Стаття')
    parent = models.IntegerField(verbose_name='Батьківський коментар')

    class Meta:
        verbose_name = 'Коментар'
        verbose_name_plural = 'Коментарі'

    def __str__(self):
        return self.name + ', ' + self.email

型号评论表

class CommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = ['name', 'email', 'text']
        widgets = {
            'name': TextInput(attrs={'class': 'form-control form--control'}),
            'email': TextInput(attrs={'class': 'form-control form--control'}),
            'text': Textarea(attrs={'rows': 5, 'class': 'form-control form--control'}),
        }

views.py

def detail(request, slug):
    blog = Blog.objects.get(slug=slug)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        form.article_id = blog.pk
        form.parent = 0
        if form.is_valid():
            form.save()
    else:
        form = CommentForm()

    return render(request, 'blog/blog_detail.html', context={'blog': blog, 'tags': blog.tags.split(','), 'form': form})

而且我一直收到错误消息 -(1048,“列 'article_id' 不能为空”)。我不明白为什么,因为我赋予它意义。

然而:如何调试变量?例如,查看表单中的内容。我以前在php编程,有一个var_dump函数。 python 是模拟的吗?

您应该设置 .instance.article_id 包裹在表格中,因此:

def detail(request, slug):
    blog = Blog.objects.get(slug=slug)
    if request.method == 'POST':
        form = CommentForm(request.POST, request.FILES)
        form<strong>.instance.article_id = blog.pk</strong>
        form<strong>.instance.parent = 0</strong>
        if form.is_valid():
            form.save()
    else:
        form = CommentForm()

    return render(request, 'blog/blog_detail.html', context={'blog': blog, 'tags': blog.tags.split(','), 'form': form})

Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.

我建议你按照下面的方式更改它,这样你会更容易理解,并且为了调试我建议你在你想要它停止的行中添加, 它会让你从控制台看到那行的所有内容

def post(request, slug):
    blog = Blog.objects.get(slug=slug)
    
    form = CommentForm(request.POST, request.FILES)
    if form.is_valid():
        form_data = form.claned_data
        comment = Comment()
        comment.article = blog
        comment.parent = 0
        comment.email = form_data.get('email')
        comment.text = form_data.get('text')
        comment.name = form_data.get('name')
        comment.save()
        
    
    context={'blog': blog,
            'tags': blog.tags.split(','),
            'form': form}
    return render(request,'blog/blog_detail.html',context)



## for debug 
    import pdb  
    pdb.set_trace()
    ## this for debug do not forget remove line