zoukankan      html  css  js  c++  java
  • 【19】网站搭建:标签功能

    一、前言

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

      转而想到自己的网站,我也想添加一个这样的功能。那么在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 %}

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

      原文出处:https://jzfblog.com/detail/127,文章的更新编辑以此链接为准。欢迎关注源站文章!

  • 相关阅读:
    TP5.1 查看具体版本
    require(): open_basedir restriction in effect. 解决方法
    解决php -v查看到版本于phpinfo()打印的版本不一致问题
    Session机制详解
    c# 获取项目的根目录
    会修电脑不会修收音机?-闲聊设计模式原则
    CSV格式数据如何导入SqlServer?
    CSV格式数据如何导入MySQL?
    反射—程序员的快乐 -08
    策略模式 是一种好策略 -07
  • 原文地址:https://www.cnblogs.com/djcoder/p/10880742.html
Copyright © 2011-2022 走看看