Django个人博客搭建教程---博客个人用户界面设计开发

示例展示

http://www.guanacossj.com/JiaBlog/mylist/

 

这个页面需要的数据主要是echarts的和用户写的文章

首先看echarts:

                        <script type="text/javascript">

                                    // 基于准备好的dom,初始化echarts实例
                                var myChart = echarts.init(document.getElementById('myechart'));
                                var option2 = {
                                    backgroundColor:'#B0B0B0',
                                    title: {
                                        text: '哎呀,不如写点什么吧~',
                                        x:'center',
                                        y: 'center',
                                        textStyle: {
                                            fontSize: '45',
                                            {#textAlign: 'middle',#}
                                        },
                                    },
                                    noDataLoadingOption: {
                                        text: '暂无数据',
                                        effect: 'bubble',
                                        effectOption: {
                                        effect: {
                                            n: 0
                                            }
                                        }
                                    },
                                    tooltip: {
                                        trigger: 'item',
                                        formatter: "{a} <br/>{b}: {c} ({d}%)"
                                    },
                                    legend: {
                                        orient: 'vertical',
                                        x: 'left',
                                        data:[{% for i in catcharts %}"{{ i }}",{% endfor %}]
                                    },
                                    series: [
                                    {
                                        name:'访问来源',
                                        type:'pie',
                                        radius: ['45%', '65%'],
                                        avoidLabelOverlap: false,
                                        label: {
                                            normal: {
                                                show: false,
                                                position: 'center'
                                            },
                                            emphasis: {
                                                show: true,
                                                textStyle: {
                                                    fontSize: '30',
                                                    fontWeight: 'bold'
                                                }
                                            }
                                        },
                                    labelLine: {
                                        normal: {
                                            show: false
                                        }
                                    },
                                    data:[
                                        {% for key,value in catcharts.items%}
                                        {value:{{ value }}, name:'{{ key }}'},
                                        {% endfor %}
                                        ]
                                    }
                                ]
                            };

                                    // 指定图表的配置项和数据
                                var option = {
                                    backgroundColor:'#B0B0B0',
                                    noDataLoadingOption: {
                                        text: '暂无数据',
                                        effect: 'bubble',
                                        effectOption: {
                                        effect: {
                                            n: 0
                                            }
                                        }
                                    },
                                    tooltip: {
                                        trigger: 'item',
                                        formatter: "{a} <br/>{b}: {c} ({d}%)"
                                    },
                                    legend: {
                                        orient: 'vertical',
                                        x: 'left',
                                        top:'30',
                                        data:[{% for i in catcharts %}"{{ i }}",{% endfor %}]
                                    },
                                    series: [
                                    {
                                        name:'访问来源',
                                        type:'pie',
                                        radius: ['45%', '65%'],
                                        avoidLabelOverlap: false,
                                        label: {
                                            normal: {
                                                show: false,
                                                position: 'center'
                                            },
                                            emphasis: {
                                                show: true,
                                                textStyle: {
                                                    fontSize: '30',
                                                    fontWeight: 'bold'
                                                }
                                            }
                                        },
                                    labelLine: {
                                        normal: {
                                            show: false
                                        }
                                    },
                                    data:[
                                        {% for key,value in catcharts.items%}
                                        {value:{{ value }}, name:'{{ key }}'},
                                        {% endfor %}
                                        ]
                                    }
                                ]
                            };

                                    // 使用刚指定的配置项和数据显示图表。
                                    {% if not catcharts %}
                                        myChart.setOption(option2);
                                    {% else %}
                                        myChart.setOption(option);
                                    {% endif %}
                            </script>

后端实现:

@check_login
def mylist(request):
    # if request.method == 'GET':
    change_info(request)
    name = request.session.get('user_name')
    username = name
    blog_list = Articles.objects.filter(status="有效").filter(authorname__name__exact=username).order_by(
        "-timestamp")  # 获取所有数据
    paginator = Paginator(blog_list, 10)  # 分页,每页10条数据
    page = request.GET.get('page')
    try:
        contacts = paginator.page(page)  # contacts为Page对象!
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)

    blog_list_views = Articles.objects.filter(status="有效").order_by('-views')[0:10]
    blog_list_greats = Articles.objects.filter(status="有效").order_by("-greats")[0:10]
    blog_list_comments = Articles.objects.filter(status="有效").order_by("-comments")[0:10]
    blog_list_news = Articles.objects.filter(status="有效").order_by("-timestamp")[0:10]  # 获取10 recent posts
    comments = Comment.objects.count()
    tags = Tag.objects.all()
    view = []
    count = Articles.objects.count()
    categorys = Category.objects.all()
    catcharts = {}
    for cats in categorys:
        catnums = Articles.objects.filter(category=cats.id).filter(status='有效').filter(
            authorname__name__exact=username).count()
        if catnums != 0:
            catcharts[cats.name] = catnums
        else:
            continue
    user = BlogUser.objects.get(name=name)
    mycategorys = Category.objects.filter(
        id__in=set([item[key] for item in blog_list.values('category') for key in item])).values('name')
    mycategorys = list([item[key] for item in mycategorys for key in item])
    django = Articles.objects.filter(category=1).filter(status='有效').filter(authorname__name__exact=username).count()
    python = Articles.objects.filter(category=2).filter(status='有效').filter(authorname__name__exact=username).count()
    leetcode = Articles.objects.filter(category=3).filter(status='有效').filter(authorname__name__exact=username).count()
    mysql = Articles.objects.filter(category=4).filter(status='有效').filter(authorname__name__exact=username).count()
    other = Articles.objects.filter(category=5).filter(status='有效').filter(authorname__name__exact=username).count()
    java = Articles.objects.filter(category=6).filter(status='有效').filter(authorname__name__exact=username).count()
    javascript = Articles.objects.filter(category=7).filter(status='有效').filter(
        authorname__name__exact=username).count()
    categorynum = [django, python, leetcode, mysql, other, java, javascript]
    categorydic = dict(zip(mycategorys, categorynum))
    try:
        version = models.Version.objects.filter(version_time=datetime.datetime.now().strftime('%Y-%m-%d')).values(
            'version_content')
        versions = [item[key] for item in version for key in item][0].split(";")
    except IndexError as err:
        print("error", err)
        version = models.Version.objects.order_by('-version_time')[0:1].values('version_content')
        versions = [item[key] for item in version for key in item][0].split(";")
    else:
        version = models.Version.objects.all()[0:1].values('version_content')
        versions = [item[key] for item in version for key in item][0].split(";")
    context = {
        'blog_list': blog_list,
        'blog_list_views': blog_list_views,
        'blog_list_comments': blog_list_comments,
        'tags': tags,
        'contacts': contacts,
        'blog_list_greats': blog_list_greats,
        'blog_list_three': blog_list_news,
        'comments': comments,
        'categorys': categorys,
        'versions': versions,
        'user': user,
        'mycategorys': mycategorys,
        # 'mycategory':mycategory,
        'django': django,
        'python': python,
        'mysql': mysql,
        'leetcode': leetcode,
        'other': other,
        'java': java,
        'javascript': javascript,
        'categorydic': categorydic,
        'catcharts': catcharts,
    }
    # print((maxarticle))
    return render(request, 'editorlist.html', context=context)

 

用装饰器检查登录状态,然后获取当前登录用户的用户名

下面看数据库表结构设计

class Articles(models.Model):
    id = models.AutoField(primary_key=True)  # id
    title = models.CharField(max_length=150)  # 博客标题
    body = models.TextField()  # 博客正文
    timestamp = models.DateTimeField()  # 创建时间
    authorname = models.ForeignKey('JiaBlog.BlogUser', on_delete=models.CASCADE)  # 作者姓名
    views = models.PositiveIntegerField(default=0)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, primary_key=False)
    tags = models.ManyToManyField(Tag, blank=True, null=True)
    greats = models.PositiveIntegerField(default=0)
    comments = models.IntegerField(default=0)
    status = models.CharField(max_length=20, default="DEL")
    brief = models.CharField(max_length=200, blank=True, null=True)
    pic = models.ImageField(upload_to='jiablogimages')
    bodypic = models.ImageField(upload_to='jiablogimages', blank=True, null=True)
    istop = models.CharField(max_length=5, default='', null=True, blank=True)
    articlebodybrief = models.TextField(blank=True, null=True)

由于authorname 是外键扩展,所以注意使用拿到的用户筛选博客作者的用法

name = request.session.get('user_name')
blog_list = Articles.objects.filter(status="有效").filter(authorname__name__exact=name).order_by("-timestamp")

然后是使用django自带的分页器

paginator = Paginator(blog_list, 10)  # 分页,每页10条数据
page = request.GET.get('page')
try:
    contacts = paginator.page(page)  # contacts为Page对象!
except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    contacts = paginator.page(1)
except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
    contacts = paginator.page(paginator.num_pages)

接下来是按照分类统计文章数,待续...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值