参考文档
1. https://cloud.tencent.com/developer/ask/34273
2. https://djangosnippets.org/snippets/2885/
3. https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display
4. https://blog.csdn.net/kkevinyang/article/details/79501576
models.py
from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth import get_user_model
from django.template.defaultfilters import slugify
from DjangoUeditor.models import UEditorField
from pyquery import PyQuery as pq
from pypinyin import lazy_pinyin
User = get_user_model()
class Node(models.Model):
"""
节点表
"""
name = models.CharField(max_length=128, unique=True, verbose_name="节点名称")
slug = models.SlugField(max_length=128, unique=True, verbose_name="url标识符")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
num_topics = models.IntegerField(default=0, verbose_name="主题数量")
category = models.ForeignKey(Category, verbose_name="所属类别")
is_show = models.BooleanField(default=True, verbose_name="显示状态")
def save(self, *args, **kwargs):
self.slug = slugify("-".join(lazy_pinyin(self.name)))
super(Node, self).save(*args, **kwargs)
class Meta:
verbose_name = "节点"
verbose_name_plural = "节点列表"
def __str__(self):
return self.name
class Article(models.Model):
"""
主题表/文章表
"""
title = models.CharField(max_length=128, verbose_name="标题")
slug = models.SlugField(max_length=128, unique=True, verbose_name="url标识符")
content = UEditorField(verbose_name="内容", imagePath="blog/images/", width=1000, height=300,
filePath="blog/files/", default='')
node = models.ForeignKey(Node, verbose_name="所属节点")
user = models.ForeignKey(User, related_name="user_article", verbose_name="作者")
source = models.ForeignKey(Source, verbose_name="来源", blank=True, null=True)
tags = models.ManyToManyField(Tag, verbose_name="标签", related_name="tags_article", blank=True)
num_views = models.IntegerField(default=0, verbose_name="浏览数量")
num_favorites = models.IntegerField(default=0, verbose_name="收藏数量")
last_answerer = models.ForeignKey(User, related_name="last_answerer_article", verbose_name="最后回复者", blank=True,
null=True)
is_show = models.BooleanField(default=True, verbose_name="显示状态")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="发表时间")
update_time = models.DateTimeField(blank=True, null=True, auto_now=True, verbose_name="更新时间")
def save(self, *args, **kwargs):
self.slug = slugify("-".join(lazy_pinyin(self.title)))
super(Article, self).save(*args, **kwargs)
def get_content_img_url(self):
temp = Article.objects.filter(pk=str(self.id)).values('content')
html = pq(temp[0]['content'])
img_path = pq(html)('img').attr('src')
return img_path
class Meta:
verbose_name = "文章"
verbose_name_plural = "文章列表"
def __str__(self):
title_short = self.title if len(self.title) < 15 else self.title[:12] + '...'
return "%s %s %s" % (self.id, self.user, title_short)
admin.py
NodeFilter 主要步骤:
1. 继承 SimpleListFilter
2. 修改 lookups,lookups 用来显示在网页上的筛选条件
3. 修改 queryset,根据传进来的值来返回查询结果
效果
