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
我正在学习 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