django 实现一个好看的博客

首先看看博客的整体概貌(因为我也是处在学习阶段,简单的来说就是一个python的业余爱好者,在B站上找的资源学习,学到了很多)

先看主界面(由于我不擅长前端,所以采用的是杨青青里的网页模板,大家可以去百度然后获取资源)在这里插入图片描述
这个是登陆界面,短信验证登陆采用的是网易云信(可以去官网查看)。
在这里插入图片描述
注册界面形式上也是类似在这里插入图片描述
邮箱找回密码采用的是网易邮箱结合django中的Api.
写博客就比较的简陋,会前端的人可以把这个变得友好一点。
在这里插入图片描述
好丑(你们也可以改好看点)
在这里插入图片描述
后台采用的是xadmin(注意版本,2.0版本最好,否则你会难受死),还比较好看,一些属性包括搜索都还不错
在这里插入图片描述
主要分为文章模块和用户模块(这个小demo,高手一般一两天就解决了),我用的就比较久(主要是学习一下加上繁忙的课程)

主要代码如下

from captcha.models import CaptchaStore
from django.contrib.auth import logout,login,authenticate
from django.contrib.auth.decorators import login_required
from django.contrib.auth.hashers import make_password
from django.core.mail import send_mail
from django.db.models import Q
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect

# Create your views here.
from django.urls import reverse

from Pikalong.settings import EMAIL_HOST_USER
from User.forms import UserRegisterForm, RegisterForm, CaptchaTestForm
from User.models import UserProfile
from User.utils import util_sendmsg, send_email, upload_image
from article.models import Article


def index(request):
    farticles = Article.objects.all().order_by(('-click_num'))
    darticles = Article.objects.all().order_by('-date')[:8]
    return render(request, 'index.html', context={'figure_articles':farticles[:3], 'darticles':darticles})


#用户注册
def user_register(request):

    if request.method == 'GET':
        return render(request, 'register.html')
    if request.method == "POST":
        username = request.POST.get('username')
        mobile =  request.POST.get('mobile')
        Password = request.POST.get('Password')
        email = request.POST.get('email')
        users = UserProfile.objects.filter(Q(username=username)|Q(mobile=mobile)).exists()
        if users:
            # return HttpResponse('注册失败')
            return render(request, 'register.html', context={'msg': '注册失败,请重新填写','yes':0})
        else:
            user = UserProfile()
            user.username = username
            user.mobile = mobile
            user.email = email
            user.password = make_password(Password)
            user.save()
            return render(request, 'register.html', context={'msg': '注册成功,即将跳转到登陆页面', 'yes':1})



def user_login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':
        username = request.POST.get('username')
        users = UserProfile.objects.filter(username=username)
        if users:
            password = request.POST.get('password')
            #方式一(通用的方式)
            # if users.first().check_password(password):
            #     request.session['username'] = username
            #     return redirect(reverse('index'))
            #
            # else:
            #     return render(request, 'login.html', context={'msg':'密码错误'})

            #方式二,前提继承了Abstrack
            user = authenticate(username=username, password=password)
            if user:
                login(request, user) #将用户对象保存在底层的request中
                request.session['username'] = username
                # return render(request, 0'login.html', context={'msg':'密码错误'})
                return redirect(reverse('index'))
            else:
                return render(request, 'login.html', context={'msg':'密码错误'})

        else:
            return render(request, 'login.html', context={'msg': '用户名不存在'})


#注销账户
def user_logout(request):
    # request.session.flush()  #删除了Cookie session 缓存里的信息

    #调用函数
    logout(request)
    return redirect(reverse('index'))


def send_code(request):
    mobile = request.GET.get('mobile')
    user = UserProfile.objects.filter(mobile=mobile).first()
    if user:
        json_result = util_sendmsg(mobile)
        # 发送验证码,第三方
        print(mobile)
        status = json_result.get('code')
        data = {
            'status':200,
            'msg':"ok"
        }
        if status == 200:
            check_code = json_result.get('obj')
            #使用session保存
            request.session[mobile] = check_code
            data['status'] = 200
            data['msg'] = '验证码发送成功'
        else:
            data['status'] = 500
            data['msg'] = '验证码发送失败'

        return JsonResponse(data=data)

    else:
        data = {
            'status':501,
            'msg':"用户不存在"
        }
        return JsonResponse(data=data)


def code_login(request):
    if request.method == 'GET':
        return render(request, 'codelogin.html')
    elif request.method == 'POST':
        mobile = request.POST.get('rp_mobile')
        code = request.POST.get('code')

        #根据mobile去session取值
        check_code = request.session.get(mobile)
        if code == check_code:
            user = UserProfile.objects.filter(mobile=mobile).first()
            if user:
                login(request, user)
                # request.session['username'] = user.username
            return redirect(reverse('index'))
        else:
            return render(request, 'codelogin.html', context={'msg':'验证码输入有误'})


def forget_password(request):
    if request.method == 'GET':
        form = CaptchaTestForm()
        return render(request, 'forget_pwd.html', context={'form':form})
    elif request.method =='POST':
        #获取提交的邮箱, 发送邮箱,通过发送的邮箱设置新的密码
        email = request.POST.get('email')
        #给此邮箱地址发送邮件
        result =send_email(email, request)
        print(result)
        print("=" *100)
        if result == 2:
            render(result, 'update_pwd.html', context={"check":'用户名不存在'})
        if result:
            render(result, 'update_pwd.html', context={"check":'验证信息已发送至您的邮箱'})
        else:
            render(result, 'update_pwd.html', context={"check":'验证信息发送失败,请稍后再试'})



#更新密码
def update_pwd(request):
    if request.method == 'GET':
        c = request.GET.get('c')
        return render(request, 'update_pwd.html',context={'c':c})
    elif request.method == 'POST':
        code = request.POST.get('code')
        uid = request.session.get(code)
        user = UserProfile.objects.get(pk=uid)
        pwd = request.POST.get('password')
        repwd = request.POST.get('rpassword')
        if pwd == repwd and user:
            pwd = make_password(pwd)
            user.password = pwd
            user.save()
            # request.session.flush()
            return render(request, 'update_pwd.html',context={'msg':'用户名密码更新成功!'})
        else:
            return render(request, 'update_pwd.html', context={'msg': '更新失败'})


#定义一个路由验证码
def valide_code(request):
    if request.is_ajax():
        key = request.GET.get('key')
        code = request.GET.get('code')
        captche = CaptchaStore.objects.filter(hashkey=key).first()
        data = {}
        if captche.response==code.lower():
            #正确
            data['status'] = 1
            print(data)
            return JsonResponse(data=data)
        else:
            #错误
            data['status'] = 0
            print(data)
            return JsonResponse(data=data)

# @login_required  #login(request, user) user-->继承Abstract
# def user_center(request):
#     user = request.user
#     if request.method == 'GET':
#         return render(request,'center.html', context={'user':user})
#     elif request.method == 'POST':
#         username = request.POST.get('username')
#         email = request.POST.get('email')
#         mobile = request.POST.get('mobile')
#         icon = request.FILES.get('icon')   #获得的只是图片的二进制信息
#         name = icon.name
#         user.username = username
#         user.email = email
#         user.mobile = mobile
#         user.icon = icon   #利用插件直接就可以保存
#         user.save()
#
#         return render(request, 'center.html', context={'user': user})
#

#图片上传到云
@login_required
def user_center(request):
    user = request.user
    if request.method == 'GET':
        return render(request, 'center.html', context={'user': user})
    elif request.method == 'POST':
        username = request.POST.get('username')
        email = request.POST.get('email')
        mobile = request.POST.get('mobile')
        icon = request.FILES.get('icon')  # 获得的只是图片的二进制信息
        name = icon.name
        user.username = username
        user.email = email
        user.mobile = mobile
        # user.icon = icon  # 利用插件直接就可以保存
        #上传到七牛云
        save_path = upload_image(icon)
        user.yunicon = save_path
        user.save()
        return render(request, 'center.html', context={'user': user})

from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.http import HttpResponse
from django.shortcuts import render, redirect

# Create your views here.


#文章详情
from django.urls import reverse

from article.forms import ArticleForm
from article.models import Article, Tag


#文章详情
def article_detail(request):
    id = request.GET.get('id')
    article = Article.objects.get(pk=id)
    article.click_num += 1
    article.save()

    #查询相关文章
    tags_list = article.tags.all()
    list_about = []
    for tag in tags_list:
        for article in tag.article_set.all():
            if article not in list_about and len(list_about) < 6:
                list_about.append(article)

    return  render(request,'info.html', context={'article':article,'list_about':list_about})


#学无止境
def article_show(request):
    tags = Tag.objects.all()[:6]
    tid = request.GET.get('tid','')
    if tid:
        tag = Tag.objects.get(pk=tid)
        articles = tag.article_set.all()
    else:
        articles = Article.objects.all()

    paginator = Paginator(articles, 1)  #Paginator(对象列表, 几条记录)


    page = request.GET.get('page', 12)  #返回的是page对象
    page = paginator.get_page(page)
    # page.has_next()  #有没有下一页
    # page.has_previous() #判断是否存在前一页
    # page.next_page_number() #获取下一页的页码数
    # page.previous_page_number() #获取前一页的页码数、

    #属性 object_list   当前页的所有对象
    # number            当前的页码数
    # paginator         分页器对象

    return render(request, 'learn.html', context={'page':page, 'tags':tags, 'tid':tid})



@login_required
def wricte_article(request):
    if request.method == 'GET':
        aform = ArticleForm()
        return  render(request, 'write.html', context={'aform':aform})
    else:
        aform = ArticleForm(request.POST)
        print(aform)
        if aform.is_valid():
            print('----------->校验成功')
            data = aform.cleaned_data
            article = Article()
            article.title = data.get('title')
            article.desc = data.get('desc')
            article.content = data.get('content')
            article.image = data.get('image')
            article.user = data.get('user')
            article.save()
            article.tags.set(data.get('tags'))
            #多对多 必须添加到文章保存的后面
            return redirect(reverse('index'))

        else:
            print("失败")
        return HttpResponse('asd')

链接如下
链接:https://pan.baidu.com/s/1pVN2BhpItbLIQtJWcHenBA
提取码:qyla
复制这段内容后打开百度网盘手机App,操作更方便哦
点我直接打开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值