Django: Я не могу понять, как сохранить модель

Я только изучаю 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, "Column 'article_id' cannot be null"). Я не могу понять почему, потому что я придаю этому значение.

И еще: как можно отладить переменную? Например, посмотреть, что в форме. Раньше я программировал на php, там была функция var_dump. Есть ли аналог в python?

Вы должны установить .article_id из .instance, обернутых в форму, так:

def detail(request, slug):
    blog = Blog.objects.get(slug=slug)
    if request.method == 'POST':
        form = CommentForm(request.POST, request.FILES)
        form.instance.article_id = blog.pk
        form.instance.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})

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
Вернуться на верх