蒋振飞的博客 - 网站搭建 (第19天) 标签功能   
正在加载蒋振飞的博客...
V3.0
蒋振飞的博客

网站搭建 (第19天) 标签功能

发布时间: 2018年10月10日 发布人: 蒋振飞 热度: 726 ℃ 评论数: 1

一、前言

在逛开源中国社区的时候,发现每一篇博客下面都有一行文章的标签,大概就是文章中的代码类型以及使用到的模块之类的。如下图,我的开源中国社区地址是:https://my.oschina.net/zhenfei,用了一段时间后废弃了,转到了博客园,所以上面的文章是不全的。

201810-10 21-05-51.png

转而想到自己的网站,我也想添加一个这样的功能。那么在Django中,非常轻松地就能通过ManyToManyField字段来将文章与标签相互关联。先看一个官方文档的例子来说明下:

@python_2_unicode_compatibleclass Publication(models.Model):
    title = models.CharField(max_length=30) 
       
    def __str__(self):        
        return self.title


@python_2_unicode_compatibleclass Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication, related_name='publications_article')    
    
    def __str__(self):        
        return self.headline

使用shell简单地演示一下:

# 创建出版商
In [4]: p1 = Publication.objects.create(title='hello')

# 创建文章
In [5]: a1 = Article.objects.create(headline='django')

# 此时出版商和文章还没有对应添加到 publication_article 表中,获取为空
In [6]: p1.publications_article.all()
Out[6]: <QuerySet []>

In [7]: p1.publications_article.add(a1)

# 获取此出版商出版的文章
In [8]: p1.publications_article.all()
Out[8]: <QuerySet [<Article: django>]>

# 获取出版此文章的出版商
In [9]: a1.publications.all()
Out[9]: <QuerySet [<Publication: hello>]>

下面就开始在自己网站中实现这一功能。

二、开发流程

1.新建Tag模型类

from django.db import models

class Tag(models.Model):
    """
    标签 Tag 也比较简单,和 Category 一样。
    再次强调一定要继承 models.Model 类!
    """
    name = models.CharField(max_length=100, verbose_name=u'标签')

    class Meta:
        verbose_name = '标签'
        verbose_name_plural = '标签'

    def __str__(self):

        return self.name

2.通过ManyToManyField将文章与标签关联

在文章Post模型类中,加上

tags = models.ManyToManyField(Tag, blank=True, verbose_name=u'标签', related_name='tag_post')

3.将Tag模型类注册在xadmin中

import xadmin
from .models import Tag

class TagAdmin(object):
    """
        作用:自定义标签管理工具
        admin.ModelAdmin:继承admin.ModelAdmin类
    """
    # 在后台显示od值,标签名
    list_display = ['id', 'name']
    # 增加过滤框,且以文章分类作过滤器
    list_filter = ['name']
    # 增加文章标题搜索字段
    search_fields = ['name']
    # 后台管理每页显示20篇文章标题


xadmin.site.register(Tag, TagAdmin)

4.定义一个模板标签

具体使用方法,请参考:Django框架13: 自定义过滤器和标签

from django import template

register = template.Library()

@register.simple_tag
def get_post_tags(obj):
    """
    获取文章下的所有标签
    :param post: 博客
    :return: 标签列表
    """
    tags_list = obj.tags.all()
    return tags_list

5.最后在网页模板中加载

具体的CSS我这里省略了,比较简单。

{% get_post_tags post as tags_list %}
{% if tags_list %}
    <div class="blog-tags">
        {% for tag in tags_list %}
            <span>{{ tag }}</span>
        {% endfor %}
    </div>
{% endif %}

这就算完成了,在后台添加好标签。最后展示如下:

2018-10-10 21-40-09 的屏幕截图.png

打赏 蒋振飞

取消

感谢您的支持,我会继续努力的!

扫码支持
一分也是爱     一块不嫌多

点击 支付宝 或 微信 打赏蒋振飞

打开支付宝扫一扫,即可进行扫码打赏哦

评论列表