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

Time:03-27

I'm just learning django. And for 2 hours I can not understand what the mistake is.

Model Blog

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

Model Comment

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

Model CommentForm

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})

and I keep getting an error - (1048, "Column 'article_id' cannot be null"). I can't understand why, because I give it meaning.

And yet: how can I debug a variable? For example, to see what's in the form. I used to program in php, there was a var_dump function. Is python analog?

CodePudding user response:

I recommend you change it in the following way, it will be easier for you to understand, and to debug I recommend you add in the line where you want it to stop , and it will let you from the console see everything from that line

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

CodePudding user response:

You should set the .article_id of the .instance wrapped in the form, so:

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.

  • Related