用Django全栈开发——15. 开发文章管理

大家好,这是皮爷给大家带来的最新的学习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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值