给我的博客网站添加了友情连接与全站公告通知功能,写篇文章记录一下。html
首先考虑了使用Django的模板标签,也是为了练练手,相关知识能够去查看Django官方文档。下面是具体实现。前端
其实友情连接直接在首页页面html里面写就能够(到如今我尚未友链呢~),可是我想经过后台来管理这个数据,索性专门建了个名为extras
的app
。python
python manage.py startapp extras
编辑models.py
文件:程序员
from django.db import models from model_utils.models import TimeStampedModel from django.utils.translation import gettext_lazy as _ # Create your models here. class FriendLink(TimeStampedModel): site_name = models.CharField(_('site_name'), max_length=100) site_domain = models.URLField(_('site_domain')) def __str__(self): return self.site_name
TimeStampedModel
是一个提供自更新的建立与修改字段的抽象基类。这里的gettext_lazy
是用来作国际化的,对个人小破站其实没什么用,之因此有这个是由于这段是我从追梦人物的开源代码上复制来的,懒得改了。django
写完代码可别忘了模型迁移。bootstrap
这里使用的是包含标签,首先要在app目录下建立templatetags
目录,并在其中建立__init__.py
文件使之成为一个包。接着建立sidebar_tags.py
,在其中编写咱们的Python代码。服务器
from django import template from ..models import FriendLink register = template.Library() @register.inclusion_tag('inclusions/_friend_link.html', takes_context=True) def show_friend_links(context, num=5): friend_link_list = FriendLink.objects.all()[:num] return { 'friend_link_list': friend_link_list }
默认显示5条数据,Django模板标签能够接收参数,像{% show_friend_links 5 %}
这样使用。app
注意这里使用的是包含标签,@register.inclusion_tag('inclusions/_friend_link.html', takes_context=True)
在装饰器里写上了须要包含的模板路径。包含标签经过渲染这个包含的模板去显示数据。dom
因此要在放置模板的templates
文件夹中新建相应的文件:ide
<div class="card mb-4 hvr-glow" style="display: flex"> <div class="card-body"> <p class="card-title text-muted"> <i class="fas fa-link" style="color: lightpink;"></i> 友情连接 </p> {% if friend_link_list %} {% for link in friend_link_list %} <p class="card-text hvr-forward col-12"> <a href="{{ link.site_domain }}" target="_blank" class="text-muted no-underline"> {{ link.site_name }} </a> </p> {% endfor %} {% endif %} </div> </div>
用了bootstrap
的card
样式,仍是比较好看的。
接下来在须要使用的地方用{% load sidebar_tags %}
载入标签,在须要添加的地方使用{% show_friend_links %}
就能够了。
一样,这个也放到扩展功能app里面去。
class SiteMessage(TimeStampedModel): content = models.TextField(verbose_name="正文") class Meta: verbose_name_plural = '通知' def __str__(self): return self.content[:20]
一样使用TimeStampedModel
免得写建立时间,程序员就是要偷懒,啦啦啦~
一样地在写完后要迁移。
# 要加上导入这个SiteMessage类 from ..models import FriendLink, SiteMessage @register.inclusion_tag('inclusions/_site_message.html', takes_context=True) def show_site_message(context): try: message = SiteMessage.objects.last() data = { 'content': message.content.replace("\r\n", "<br/>"), 'created': message.created.strftime("%Y/%m/%d"), } except: data = { "content": "o(╥﹏╥)o服务器链接失败~" } return data
经过SiteMessage.objects.last()
每次只取最新的数据。使用方法同上。
为了让页面显示协调一点,我花了很多时间,前端真的是博大精深(太难了)。
base.html
文件,一个有侧边栏,一个没有,按须要继承。base.html
修改,固定了侧边栏,放在{% block side %}{% endblock side %}
中,而且将两个标签都放进去,在文章详情页面,侧边栏须要目录,目录下面用{% block.super %}
来显示父级的内容。bootstrap
的滚动监听,不事后来发现侧边栏内容仍是要多显示比较好,与全都放到粘性侧边栏里了。base.html
文件(写这篇文的时候发现我忘了删除没用的那个。。。),而且把侧边栏block
给去掉了。代码都放在了Github上,关注公众号在底部菜单查看Github地址。
扫码关注公子政的宅平常第一时间查看最新推送: