文章页设计|django个人博客开发

作者 夜狼荼 2019年05月31日 01:55 阅读 1318

创建文章app:article

新建应用articlepython manage.py startapp article

废话不多说,直接上代码。 有问题可以留言

model.py

from django.db import models
from django.utils.html import format_html
from django.urls import reverse
from django.contrib.auth.models import User

# CHOICES 属性标记
ISGOOD_CHOICES = [(0, '无'), (1, "置顶"), (2, "推荐"), (3, "Banner"), (4, "头条"), (5, "网站公告")]

#tab标签model
class Tag(models.Model):
    name = models.CharField(max_length=100, verbose_name='名称')

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

    def get_absolute_url(self):
        return reverse('tag', args=[self.pk])

    def __str__(self):
        return self.name


# 栏目model
class Categorg(models.Model):
    CLASS_LEVEL_CHOICES = [(1, '一级栏目'), (2, "二级栏目") ]

    name = models.CharField(max_length=100, verbose_name='栏目名称')
    keywords = models.CharField(max_length=100, verbose_name='关键词', blank=True)
    catepic = models.ImageField(upload_to='categorg/', verbose_name='栏目图片', blank=True, null=True, help_text='建议图片大小:236*180')
    sort = models.IntegerField(verbose_name='排序ID', default=0)
    class_level = models.PositiveIntegerField(choices=CLASS_LEVEL_CHOICES, default=1, verbose_name='栏目等级')
    fcate = models.ForeignKey('self', on_delete=models.CASCADE, verbose_name='父栏目', blank=True, null=True, )
    isshow = models.BooleanField(default=True, verbose_name="是否导航")
    description = models.TextField(max_length=200, verbose_name='描述', blank=True)
    ispost = models.BooleanField(verbose_name='终极栏目', default=True)

    def get_absolute_url(self):
        return reverse('list', args=[self.pk])

    class Meta:
        verbose_name = '栏目分类'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

    def get_view_url(self):
        return format_html('<a href="{}" target="_blank">预览</a>', self.get_absolute_url())
    get_view_url.short_description = '预览'


#文章页model
class Post(models.Model):
    title = models.CharField(max_length=70, verbose_name='标题')
    color = models.CharField(max_length=10, blank=True,verbose_name='标题颜色')
    isgood = models.PositiveIntegerField(choices=ISGOOD_CHOICES, default=0, verbose_name='属性')
    titlepic = models.ImageField(upload_to='article/%Y/%m/', verbose_name='标题图片', blank=True, null=True, help_text='建议图片大小:200*140, 幻灯片:616*260')
    category = models.ForeignKey(Categorg, on_delete=models.CASCADE, verbose_name='栏目')
    keywords = models.CharField(max_length=150, blank=True, verbose_name='关键词')
    description = models.CharField(max_length=200, blank=True, null=True, verbose_name="摘要")
    body = MDTextField(verbose_name='内容')
    tags = models.ManyToManyField(Tag, blank=True, verbose_name='标签')
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    modified_time = models.DateTimeField(verbose_name='更新时间', auto_now=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者', null=True)
    passwrod = models.CharField(max_length=32, blank=True, verbose_name='是否加密', null=True)
    onclick = models.PositiveIntegerField(verbose_name='阅读', default=0)
    onlike = models.PositiveIntegerField(verbose_name='点赞', default=0)
    zhuanti = models.ManyToManyField(Subject, blank=True, null=True, verbose_name='所属专题')

    def on_click(self):
	# 执行on_click 自动阅读+1
        self.onclick += 1
        self.save(update_fields=['onclick'])

    def get_next_post(self):
	# 获取下一篇文章
        obj = Post.objects.filter(pk__gt=self.pk, category=self.category).first()
        return obj

    def get_pre_post(self):
	# 获取上一篇文章
        obj = Post.objects.filter(pk__lt=self.pk, category=self.category).first()
        return obj

    def get_absolute_url(self):
	# 获取本文章的url
        return reverse('info', args=[self.pk])

    class Meta:
        verbose_name = '文章管理'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title

    def title_color(self):
	# 后台标题+颜色
        if self.color is not '':
            return format_html('<font style="color: {}">{}</font>', self.color, self.title)
        else:
            return self.title

文章后台定制 admin.py

from django.contrib import admin
from .models import Post, Tag, Categorg


@admin.register(Categorg)
class CategorgAdmin(admin.ModelAdmin):
    list_display = ['pk', 'name', 'sort', 'class_level', 'fcate', 'isshow', 'get_view_url']
    list_editable = ['sort', 'class_level', 'fcate', 'isshow']
    list_display_links = ['name']


@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ['pk', 'title_color','category', 'create_time', 'onclick', 'isgood', 'get_view_url']
    list_editable = ['category', 'isgood']
    list_filter = ['category', 'isgood']
    search_fields = ['title']
    filter_horizontal = ['tags', 'zhuanti']
    list_display_links = ['title']


@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    pass

发表评论