大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程,从零开始,到最后成功部署上线的项目。这一节,我们来开发文章的管理功能,包括发布,查看,修改和删除。
上一节我们开发了Category和Tag的管理,这一节我们就开发一下文章的管理。
修改SideBar
首先是在sidebar引入文章管理的两个页面:发布文章和管理页面。同样,我们还要在cms目录下,创建一个post目录,在里面同样有个manage.html和publish.html:
我们的思路还是和之前开发一样的,复用publish.html页面,即发布和修改是同一个页面,通过是否传入文章内容来确认功能。
Post的新增
关于文章的模型,我们在第13节详细的说过,这里就简单的来看一下Post的model有哪些东西,下面的代码在app/post目录下的models.py文件里:
class Post(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('peekpauser.User', on_delete=models.SET_NULL, null=True)
description = models.CharField(max_length=200)
thumbnail = models.URLField()
content = models.TextField()
content_html = models.TextField(blank=True, editable=False)
is_md = models.BooleanField(default=True)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
tag = models.ManyToManyField(Tag)
priority = models.IntegerField(default=-1)
is_hot = models.BooleanField(default=False)
is_top = models.BooleanField(default=False)
is_main_page = models.BooleanField(default=False)
status = models.PositiveIntegerField(default=STATUS_DRAFT, choices=STATUS_ITEMS)
publish_time = models.DateTimeField(auto_now_add=True)
publish_time_show = models.DateTimeField(default=datetime.datetime.now)
time_id = models.CharField(blank=True, max_length=30)
read_num = models.PositiveIntegerField(default=0)
文章类里面属性较多,所以,我们在开发文章发布页面的时候,理应把这些属性都应该带进去。
我们通过Bootstrap来写好文章的发布页面的表格,最终样子应该长下面这样:
可以看到中间有些部分采用的是Droplist,比如Author,Category, Status,最下面的Tag还是一个区域的checkbox。
这里的publish.html页面就会和之前的页面不一样,因为我们在这个页面里面,需要显示以下数据:
- Author;
- Category;
- Tag
这些数据都是从数据库里面读取的。所以,我们的post_publish_view
方法里面,就要读取出来这些数据,然后通过context的形势返回到前端页面。
def post_publish_view(request):
context = {
'list_data_category': Category.objects.all(),
'list_data_tag': Tag.objects.all(),
'list_data_user': User.objects.all(),
'list_data_status': Post.STATUS_ITEMS,
'form': PostForm()
}
return render(request, 'cms/post/publish.html', context=context)
同样,我们还是要使用Post请求来发送整个表单数据, 所以,我们要和Tag还有Category一样,写一个PostView,还需要一个PostForm。但是这里的PostForm有些不一样:
class PostForm(forms.ModelForm, FormMixin):
tag_id = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Tag.objects.all())
class Meta:
model = Post
exclude = ('tag',)
这里我们要单独创建一个tag_id
变量,是因为在我们的Post模型中,tag是一个ManyToMany的类型,这里我们需要在表单中,使用ModelMultipleChoiceField类型将前端返回的多选的Tag封装起来,然后再创建Post实例,保存起来。
所以,这个时候,我们的后端更新文章的代码就是这样:
class PostView(View):
def post(self, request):
# 新建提交
if 'submit' in request.POST:
form = PostForm(request.POST)
if form.is_valid():
title = form.cleaned_data.get('title')
description = form.cleaned_data.get('description')
author = form.cleaned_data.get('author')
thumbnail = form.cleaned_data.get('thumbnail')
status = form.cleaned_data.get('status')
content = form.cleaned_data.get('content')
is_md = form.cleaned_data.get('is_md')
category