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