Django之BBS博客项目
一、登陆功能(验证码)
1 from geetest importGeetestLib2 from django.contrib importauth3 4 #使用极验滑动验证码的登陆 5 deflogin(request):6 if request.method == "POST":7 #初始化一个返回给ajax的字典 8 ret = {"status":0,"msg":""}9 #从提交的数据中获取用户名和密码 10 username = request.POST.get("username")11 password = request.POST.get("password")12 #获取验证码相关数据 13 gt =GeetestLib(pc_geetest_id, pc_geetest_key)14 challenge = request.POST.get(gt.FN_CHALLENGE, '')15 validate = request.POST.get(gt.FN_VALIDATE, '')16 seccode = request.POST.get(gt.FN_SECCODE, '')17 status =request.session[gt.GT_STATUS_SESSION_KEY]18 user_id = request.session["user_id"]19 20 ifstatus:21 result =gt.success_validate(challenge, validate, seccode, user_id)22 else:23 result =gt.failback_validate(challenge, validate, seccode)24 25 #如果result有值,则验证成功,利用auth做验证 26 ifresult:27 user = auth.authenticate(username=username,password=password)28 ifuser:29 #如果用户名密码正确 30 auth.login(request,user)31 ret["msg"] = "/index/" 32 else:33 ret["status"] = 1 34 ret["msg"] = "用户名密码错误" 35 else:36 #如果验证吗错误 37 ret["status"] = 1 38 ret["msg"] = "验证码错误" 39 returnJsonResponse(ret)40 return render(request,"login.html",locals())41 42 #请在官网申请ID使用,示例ID不可使用 43 pc_geetest_id = "b46d1900d0a894591916ea94ea91bd2c" 44 pc_geetest_key = "36fc3fe98530eea08dfc6ce76e3d24c4" 45 46 #获取滑动验证码 47 defget_geetest(request):48 user_id = 'test' 49 gt =GeetestLib(pc_geetest_id, pc_geetest_key)50 status =gt.pre_process(user_id)51 request.session[gt.GT_STATUS_SESSION_KEY] =status52 request.session["user_id"] =user_id53 response_str =gt.get_response_str()54 return HttpResponse(response_str)
1 <!DOCTYPE html> 2 <htmllang="en"> 3 <head> 4 <metacharset="UTF-8"> 5 <title>Title</title> 6 <linkrel="stylesheet"href="/static/bootstrap/css/bootstrap.min.css"> 7 <linkrel="stylesheet"href="/static/css/mystyle.css"> 8 </head> 9 <body> 10 11 <divclass="container"> 12 <divclass="row"> 13 <formclass="form-horizontal col-md-6 col-md-offset-3 login-form"> 14 {% csrf_token %}15 <divclass="form-group"> 16 <labelfor="username"class="col-sm-2 control-label">用户名</label> 17 <divclass="col-sm-10"> 18 <inputtype="text"class="form-control"id="username"name="username"placeholder="用户名"> 19 </div> 20 </div> 21 <divclass="form-group"> 22 <labelfor="password"class="col-sm-2 control-label">密码</label> 23 <divclass="col-sm-10"> 24 <inputtype="password"class="form-control"id="password"name="password"placeholder="密码"> 25 </div> 26 </div> 27 <divclass="form-group"> 28 <divid="popup-captcha"></div> 29 </div> 30 <divclass="form-group"> 31 <divclass="col-sm-offset-2 col-sm-10"> 32 <buttontype="button"class="btn btn-default"id="login-button">登录</button> 33 <spanclass="login-error"></span> 34 </div> 35 </div> 36 </form> 37 </div> 38 </div> 39 40 41 <scriptsrc="/static/jquery.js"></script> 42 <scriptsrc="/static/bootstrap/js/bootstrap.min.js"></script> 43 <!--引入封装了failback的接口--initGeetest--> 44 <scriptsrc="http://static.geetest.com/static/tools/gt.js"></script> 45 <script> 46 //发送数据 47 varhandlerPopup= function(captchaObj) {48 //成功的回调 49 captchaObj.onSuccess(function() {50 varvalidate=captchaObj.getValidate();51 varusername=$("#username").val();52 varpassword=$("#password").val();53 $.ajax({54 url:"/login/",//进行二次验证 55 type:"post",56 dataType:"json",57 data: {58 username: username,59 password: password,60 csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),61 geetest_challenge: validate.geetest_challenge,62 geetest_validate: validate.geetest_validate,63 geetest_seccode: validate.geetest_seccode64 },65 success:function(data) {66 if(data.status){67 $(".login-error").text(data.msg);68 }else{69 location.href=data.msg;70 }71 }72 });73 });74 //绑定事件显示滑动验证码 75 $("#login-button").click(function() {76 captchaObj.show();77 });78 //将验证码加到id为captcha的元素里 79 captchaObj.appendTo("#popup-captcha");80 //更多接口参考:http://www.geetest.com/install/sections/idx-client-sdk.html 81 };82 83 //验证开始需要向网站主后台获取id,challenge,success(是否启用failback) 84 $.ajax({85 url:"/pc-geetest/register?t=" +(newDate()).getTime(),//加随机数防止缓存 86 type:"get",87 dataType:"json",88 success:function(data) {89 //使用initGeetest接口 90 //参数1:配置参数 91 //参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件 92 initGeetest({93 gt: data.gt,94 challenge: data.challenge,95 product:"popup",//产品形式,包括:float,embed,popup。注意只对PC版验证码有效 96 offline:!data.success//表示用户后台检测极验服务器是否宕机,一般不需要关注 97 //更多配置参数请参见:http://www.geetest.com/install/sections/idx-client-sdk.html#config 98 }, handlerPopup);99 }100 });101 102 103 </script> 104 </body> 105 </html>
二、注册功能(ajax上传数据)
1 defregister(request):2 if request.method == "POST":3 form_obj =RegisterForm(request.POST)4 ret = {"status": 0, "msg": ""}5 ifform_obj.is_valid():6 form_obj.cleaned_data.pop("re_pwd")7 avatar = request.FILES.get("avatar")8 models.UserInfo.objects.create(**form_obj.cleaned_data,avatar=avatar)9 returnJsonResponse(ret)10 else:11 ret["status"] = 1 12 ret["msg"] =form_obj.errors13 returnJsonResponse(ret)14 form_obj =RegisterForm()15 return render(request,"register.html",locals())
1 <!DOCTYPE html> 2 <htmllang="en"> 3 <head> 4 <metacharset="UTF-8"> 5 <title>Title</title> 6 <linkrel="stylesheet"href="/static/bootstrap/css/bootstrap.min.css"> 7 <linkrel="stylesheet"href="/static/css/mystyle.css"> 8 </head> 9 <body> 10 11 <divclass="container"> 12 <divclass="row"> 13 <formclass="form-horizontal register-form"method="post"action="/register/"novalidate enctype="multipart/form-data"> 14 {% csrf_token %}15 <divclass="form-group"> 16 <labelfor="{{ form_obj.username.id_for_label }}"class="col-sm-2 control-label">{{ form_obj.username.label }}</label> 17 <divclass="col-sm-4"> 18 {{ form_obj.username }}19 <spanid="helpBlock2"class="help-block">{{ form_obj.username.errors.0 }}</span> 20 </div> 21 </div> 22 23 <divclass="form-group"> 24 <labelfor="{{ form_obj.password.id_for_label }}"class="col-sm-2 control-label">{{ form_obj.password.label }}</label> 25 <divclass="col-sm-4"> 26 {{ form_obj.password }}27 <spanid="helpBlock2"class="help-block">{{ form_obj.password.errors.0 }}</span> 28 </div> 29 </div> 30 31 <divclass="form-group"> 32 <labelfor="{{ form_obj.re_pwd.id_for_label }}"class="col-sm-2 control-label">{{ form_obj.re_pwd.label }}</label> 33 <divclass="col-sm-4"> 34 {{ form_obj.re_pwd }}35 <spanid="helpBlock2"class="help-block">{{ form_obj.re_pwd.errors.0 }}</span> 36 </div> 37 </div> 38 39 <divclass="form-group"> 40 <labelfor="{{ form_obj.email.id_for_label }}"class="col-sm-2 control-label">{{ form_obj.email.label }}</label> 41 <divclass="col-sm-4"> 42 {{ form_obj.email }}43 <spanid="helpBlock2"class="help-block">{{ form_obj.email.errors.0 }}</span> 44 </div> 45 </div> 46 47 <divclass="form-group"> 48 <labelclass="col-sm-2 control-label">头像</label> 49 <divclass="col-sm-4"> 50 <labelfor="id_avatar"><imgid="avatar-img"src="/static/avatar/default.png"></label> 51 <inputtype="file"name="avatar"id="id_avatar"style="display:none"> 52 <spanid="helpBlock2"class="help-block"></span> 53 </div> 54 </div> 55 56 <divclass="form-group"> 57 <divclass="col-sm-offset-2 col-sm-10"> 58 <buttontype="button"class="btn btn-success"id="register-btn">注册</button> 59 </div> 60 </div> 61 </form> 62 </div> 63 </div> 64 65 66 <scriptsrc="/static/jquery.js"></script> 67 <scriptsrc="/static/bootstrap/js/bootstrap.min.js"></script> 68 <script> 69 //获取头像,自动加载显示选中的头像 70 $("#id_avatar").change(function(){71 //第一步、创建一个读取文件的对象 72 varfileReader= newFileReader();73 //第二步、读取选中的文件 74 fileReader.readAsDataURL(this.files[0]);75 //读取文件需要时间,所以要等到读取完文件,再进行下一步操作 76 fileReader.onload= function(){77 //第三步、把图片加入img标签中 78 $("#avatar-img").attr("src",fileReader.result)79 }80 });81 82 //ajax上传注册信息并获取错误信息 83 $("#register-btn").click(function(){84 85 //ajax上传文件,data部分必须用对象 86 varformData= newFormData();87 formData.append("username",$("#id_username").val());88 formData.append("password",$("#id_password").val());89 formData.append("re_pwd",$("#id_re_pwd").val());90 formData.append("email",$("#id_email").val());91 formData.append("avatar",$("#id_avatar")[0].files[0]);92 formData.append("csrfmiddlewaretoken",$("[name='csrfmiddlewaretoken']").val());93 94 $.ajax({95 url:"/register/",96 type:"post",97 //ajax上传文件需要加两个参数 98 processData:false,99 contentType:false,100 data:formData,101 success:function(data){102 if(data.status){103 //如果有错误,则返回错误信息 104 $.each(data.msg,function(k,v){105 //k是键,v是值,但是v是列表,错误信息可能有多个 106 $("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error");107 })108 }else{109 //如果没有错误,则跳转到指定页面 110 location.href= "/login/" 111 }112 }113 })114 })115 116 //输入框取得焦点时,清楚错误信息 117 $("form input").focus(function(){118 $(this).next("span").text("").parent().parent().removeClass("has-error");119 });120 121 </script> 122 </body> 123 </html>
三、博客主页
配置media用户上传数据:
1、在settings中配置:
1 #Django用户上传的文件都叫media文件 2 MEDIA_URL = '/media/' 3 MEDIA_ROOT = os.path.join(BASE_DIR,"media")
2、在url中配置:
1 from django.views.static importserve2 from django.conf importsettings3 4 urlpatterns =[5 #media相关路由设置 6 re_path(r'^media/(?P<path>.*)$', serve, {"document_root": settings.MEDIA_ROOT}),7 ]
主页html:
1 <!DOCTYPE html> 2 <htmllang="en"> 3 <head> 4 <metacharset="UTF-8"> 5 <title>Title</title> 6 <linkrel="stylesheet"href="/static/bootstrap/css/bootstrap.min.css"> 7 <linkrel="stylesheet"href="/static/css/mystyle.css"> 8 <style> 9 .box{position:relative;} 10 .left-info{display:inline-block;width:10%;margin-left:85px;} 11 .main-info{display:inline-block;width:70%;} 12 .right-info{display:inline-block;width:10%;} 13 .author-avatar{width:70px;height:70px;} 14 .article-footer span{margin-right:10px;} 15 .article-footer{margin-top:10px;} 16 </style> 17 </head> 18 <body> 19 20 //把默认导航条第一个nav标签的navbar-default改成-inverse就从白色变成黑色21 {#导航条#}22 <navclass="navbar navbar-inverse"> 23 <divclass="container-fluid"> 24 <!--Brand and toggle get grouped for better mobile display--> 25 <divclass="navbar-header"> 26 <buttontype="button"class="navbar-toggle collapsed"data-toggle="collapse" 27 data-target="#bs-example-navbar-collapse-1"aria-expanded="false"> 28 <spanclass="sr-only">Toggle navigation</span> 29 <spanclass="icon-bar"></span> 30 <spanclass="icon-bar"></span> 31 <spanclass="icon-bar"></span> 32 </button> 33 <aclass="navbar-brand"href="#">博客项目</a> 34 </div> 35 36 <!--Collect the nav links, forms, and other content for toggling--> 37 <divclass="collapse navbar-collapse"id="bs-example-navbar-collapse-1"> 38 <ulclass="nav navbar-nav"> 39 <liclass="active"><ahref="#">Link <spanclass="sr-only">(current)</span></a></li> 40 <li><ahref="#">Link</a></li> 41 </ul> 42 43 <ulclass="nav navbar-nav navbar-right"> 44 {% if request.user.username %}45 <li><ahref="#">{{ request.user.username }}</a></li> 46 <liclass="dropdown"> 47 <ahref="#"class="dropdown-toggle"data-toggle="dropdown"role="button"aria-haspopup="true" 48 aria-expanded="false">个人中心 <spanclass="caret"></span></a> 49 <ulclass="dropdown-menu"> 50 <li><ahref="#">Action</a></li> 51 <li><ahref="#">Another action</a></li> 52 <li><ahref="#">Something else here</a></li> 53 <lirole="separator"class="divider"></li> 54 <li><ahref="/logout">注销账户</a></li> 55 </ul> 56 </li> 57 {% else %}58 <li><ahref="/login">登陆</a></li> 59 <li><ahref="/register">注册</a></li> 60 {% endif %}61 </ul> 62 </div><!--/.navbar-collapse--> 63 </div><!--/.container-fluid--> 64 </nav> 65 66 <!--页面主体--> 67 <divclass="box"> 68 <divclass="left-info"> 69 <divclass="panel panel-primary"> 70 <divclass="panel-heading">广告</div> 71 <divclass="panel-body"> 72 Panel content73 </div> 74 </div> 75 <divclass="panel panel-info"> 76 <divclass="panel-heading">Panel heading without title</div> 77 <divclass="panel-body"> 78 Panel content79 </div> 80 </div> 81 </div> 82 <divclass="main-info"> 83 <!--文章开始--> 84 <divclass="article-list"> 85 {% for article in article_list %}86 <divclass="article"> 87 <h3><ahref="#">{{ article.title }}</a></h3> 88 <divclass="media"> 89 <divclass="media-left"> 90 <ahref="#"> 91 <imgclass="media-object author-avatar"src="/{{ article.user.avatar }}"alt="..."> 92 </a> 93 </div> 94 <divclass="media-body"> 95 <h4class="media-heading">{{ article.desc }}</h4> 96 </div> 97 </div> 98 <divclass="article-footer"> 99 <span><ahref="#">{{ article.user.username }}</a></span> 100 <span>发布于 {{ article.create_time|date:"Y-m-d H:i:s" }}</span> 101 <spanclass="glyphicon glyphicon-comment">评论({{ article.comment_count }})</span> 102 <spanclass="glyphicon glyphicon-thumbs-up">点赞({{ article.up_count }})</span> 103 </div> 104 </div> 105 {% endfor %}106 </div> 107 <!--文章结束--> 108 </div> 109 <divclass="right-info"> 110 <divclass="panel panel-primary"> 111 <divclass="panel-heading">广告</div> 112 <divclass="panel-body"> 113 Panel content114 </div> 115 </div> 116 <divclass="panel panel-info"> 117 <divclass="panel-heading">Panel heading without title</div> 118 <divclass="panel-body"> 119 Panel content120 </div> 121 </div> 122 </div> 123 124 </div> 125 <!--页面结束--> 126 127 <scriptsrc="/static/jquery.js"></script> 128 <scriptsrc="/static/bootstrap/js/bootstrap.min.js"></script> 129 <script> 130 131 </script> 132 </body> 133 </html>
四、文章详情(点赞、评论)
1 defuser_index(request,username):2 user_obj = models.UserInfo.objects.filter(username=username).first()3 return render(request,"user_index.html",locals())
1 <!DOCTYPE html> 2 <htmllang="en"> 3 <head> 4 <metacharset="UTF-8"> 5 <title>Title</title> 6 <linkrel="stylesheet"href="/static/bootstrap/css/bootstrap.min.css"> 7 <style> 8 #div_digg{ 9 float:right; 10 margin-bottom:10px; 11 margin-right:30px; 12 font-size:12px; 13 width:125px; 14 text-align:center; 15 margin-top:10px; 16 } 17 18 .diggit{ 19 float:left; 20 width:46px; 21 height:52px; 22 background-image:url('//static.cnblogs.com/images/upup.gif'); 23 text-align:center; 24 cursor:pointer; 25 margin-top:2px; 26 padding-top:5px; 27 } 28 29 .buryit{ 30 float:right; 31 margin-left:20px; 32 width:46px; 33 height:52px; 34 background-image:url('//static.cnblogs.com/images/downdown.gif'); 35 text-align:center; 36 cursor:pointer; 37 margin-top:2px; 38 padding-top:5px; 39 } 40 .comment{ 41 margin-top:70px; 42 } 43 #commentform_title{ 44 background-image:url('//static.cnblogs.com/images/icon_addcomment.gif'); 45 background-repeat:no-repeat; 46 padding:0 0 0 25px; 47 margin-bottom:10px; 48 } 49 #comment-content{ 50 width:400px; 51 height:200px; 52 } 53 </style> 54 </head> 55 <body> 56 57 {#文章#}58 <h2>{{ article_det.article.title }}</h2> 59 <div>{{ article_det.content }}</div> 60 61 {#点赞#}62 {% csrf_token %}63 <divclass="clearfix"> 64 <divid="div_digg"> 65 <divclass="diggit action"> 66 <spanclass="diggnum"id="digg_count">{{ article_det.article.up_count }}</span> 67 </div> 68 <divclass="buryit action"> 69 <spanclass="burynum"id="bury_count">{{ article_det.article.down_count }}</span> 70 </div> 71 <divclass="clear"></div> 72 <divclass="diggword"id="digg_tips"></div> 73 </div> 74 </div> 75 76 {#评论列表#}77 <ulclass="list-group"> 78 {% for comment in comment_list %}79 <liclass="list-group-item"> 80 <div> 81 <ahref="">{{ forloop.counter }}楼</a> 82 <ahref="">{{ comment.user }}</a> 83 <span>{{ comment.create_time|date:"Y-m-d H-i" }}</span> 84 <a><spanclass="son-comment"username="{{ comment.user }}"pid="{{ comment.id }}">回复</span></a> 85 </div> 86 <div> 87 {{ comment.content }}88 </div> 89 </li> 90 {% endfor %}91 </ul> 92 93 94 {#写评论#}95 <divclass="comment"> 96 <divid="commentform_title">发表评论</div> 97 <p>用户<inputtype="text"disabled value="{{ article_det.article.user }}"></p> 98 <div>评论内容</div> 99 <div> 100 <textareaid="comment-content"></textarea> 101 </div> 102 <div><buttonid="comment-btn">提交评论</button></div> 103 </div> 104 105 106 <scriptsrc="/static/jquery.js"></script> 107 <script> 108 //点赞 109 $(".action").click(function(){110 //判断是赞还是踩 111 varis_up=$(this).hasClass("diggit");112 console.log(is_up)113 //发送数据给后端 114 $.ajax({115 url:"/up_down/",116 type:"post",117 data:{118 article_id:{{ article_id }},119 is_up:is_up,120 csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),121 },122 success:function(data) {123 if(data.status){124 if(is_up){125 varup_count=$("#digg_count").text()126 up_count=parseInt(up_count)+1 127 $("#digg_count").text(up_count)128 }else{129 vardown_count=$("#bury_count").text()130 down_count=parseInt(down_count)+1 131 $("#bury_count").text(down_count)132 }133 }else{134 $("#digg_tips").text("已经评价过")135 }136 }137 })138 })139 140 141 pid="" 142 //发送评论 143 $("#comment-btn").click(function(){144 varcomment=$("#comment-content").val();145 if(comment!=""){146 $.ajax({147 url:"/comment/",148 type:"post",149 data:{150 csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),151 comment_content : comment,152 pid: pid,153 article_id: {{ article_det.article.pk }}154 },155 success:function(data){156 varcreate_time=data.create_time;157 varcontent=data.comment_content;158 varusername=data.username;159 varli= '<li class="list-group-item"><div><span style="color: gray">' +create_time+ '</span> <a href=""><span>' +username+ '</span></a></div> <div class="con"> <p>' +content+ '</p> </div> </li>' 160 $(".list-group").append(li)161 //清空评论输入框 162 $("#comment-content").val("");163 //清空pid 164 pid= "" 165 }166 })167 }168 169 })170 171 //回复评论 172 $(".son-comment").click(function(){173 $("#comment-content").focus();174 varv= "@" +$(this).attr("username")+ "\n";175 $("#comment-content").val(v);176 pid=$(this).attr("pid")177 })178 </script> 179 </body> 180 </html>
五、添加文章(富文本编辑器)
链接:http://kindeditor.net/doc.php
1 from my_bbs_again importsettings2 importjson,os3 defuploadJson(request):4 obj = request.FILES.get("uploadJson_name")5 path = os.path.join(settings.MEDIA_ROOT,'uploadJson',obj.name)6 7 with open(path,"wb") as f:8 for line inobj:9 f.write(line)10 11 ret = {"error":0,"url":"/media/uploadJson/"+obj.name}12 return HttpResponse(json.dumps(ret))
1 <!DOCTYPE html> 2 <htmllang="en"> 3 <head> 4 <metacharset="UTF-8"> 5 <title>Title</title> 6 <linkrel="stylesheet"href="/static/bootstrap/css/bootstrap.min.css"> 7 <style> 8 *{ 9 margin:0; 10 } 11 .header{ 12 width:100%;height:80px;background-color:#1b6d85;line-height:80px; 13 } 14 .header h1{line-height:80px;margin-left:20px} 15 </style> 16 </head> 17 <body> 18 19 <divclass="header"> 20 <h1>{{ user_obj.blog.title }}</h1> 21 </div> 22 23 {#添加文章#}24 <divclass="add_article"> 25 <div>添加文章</div> 26 <formaction=""method="post"> 27 {% csrf_token %}28 <div>文章标题<inputtype="text"name="title"></div> 29 <textareaid="editor_id"name="content"style="width:700px;height:300px;"></textarea> 30 <div><inputtype="submit"></div> 31 </form> 32 33 </div> 34 35 <scriptsrc="/static/jquery.js"></script> 36 <scriptcharset="utf-8"src="/static/kindeditor/kindeditor-all.js"></script> 37 <scriptcharset="utf-8"src="/static/kindeditor/lang/zh-CN.js"></script> 38 <script> 39 KindEditor.ready(function(K) {40 window.editor=K.create('#editor_id',{//添加参数 41 //height,width 42 items:[43 'source','|','undo','redo','|','preview','print','template','code','cut','copy','paste',44 'plainpaste','wordpaste','|','justifyleft','justifycenter','justifyright',45 'justifyfull','insertorderedlist','insertunorderedlist','indent','outdent','subscript',46 'superscript','clearhtml','quickformat','selectall','|','fullscreen','/',47 'formatblock','fontname','fontsize','|','forecolor','hilitecolor','bold',48 'italic','underline','strikethrough','lineheight','removeformat','|','image','multiimage',49 'flash','media','insertfile','table','hr','emoticons','baidumap','pagebreak',50 'anchor','link','unlink','|','about' 51 ],52 uploadJson:'/uploadJson/',//指定上传文件的路径 53 extraFileUploadParams:{//和文件一起上传的数据,如csrftoken 54 csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),55 },56 filePostName:"uploadJson_name" //上传的文件的名字 57 });58 });59 60 </script> 61 62 </body> 63 </html>
转载于:https://www.cnblogs.com/yinwenjie/p/10332081.html
Django之BBS博客项目相关推荐
- 项目5 BBS博客项目
第一部分:需求分析: 一.需要哪些表 1.用户表 用户名,密码,头像 2.文章表 作者,标题,摘要,发布时间, 3.文章详细 文章,内容 4.评论表 评论文章,评论者,评论时间,评论内容,是谁的子评论 ...
- django项目转pyc_Python自动化运维系列:Django搭建小博客
如何使用Django和Python怎么搭建一个小博客呢? 这是一个简单而困难的问题.简单的原因是,只要做过一次,基本上就能做到举一反三: 困难的原因是有没有用心和耐心去完成这个实验. 如果你成功了,那 ...
- Python Web开发:Django+BootStrap实现简单的博客项目
创建blog的项目结构 关于如何创建一个Django项目,请查看[Python Web开发:使用Django框架创建HolleWorld项目] 创建blog的数据模型 创建一个文章类 所有开发都是数据 ...
- 利用django+pycharm开发小型博客项目!!!
废话不多说,让我王虎剩大将军带领大家利用djang框架开发一个小型的博客项目吧!! 首先,此教程适合的人群为,懂得创建python的虚拟环境,以及拥有少数web前端开发的经验,并且拥有少数的后端编程经 ...
- Django day17 博客项目(一)
一: 博客项目需求分析 首页(显示文章) 文章详情 点赞, 点踩 文章评论 字评论 评论的展示 登录功能(图片验证码) 注册功能(基于form验证,ajax) 个人站点(不同人不同样式,文章过滤) 后 ...
- python搭建博客项目思路_Django项目——Blog简易开发入门
一.模型层 模型层是什么 位于视图与数据库之间 pytho对象与数据库表的转换 为什么需要模型层 屏蔽不同数据库之间的差异 开发者更加专注于业务逻辑的开发 提供多种便捷的工具有利于开发工作 模型层的配 ...
- html 两个idv上下居中,Django搭建个人博客:回到顶部浮动按钮、矢量图标、页脚沉底和粘性侧边栏...
本章集中介绍四个重要的小功能:回到顶部浮动按钮.矢量图标.页脚沉底和粘性侧边栏. 这几个功能与Django基本没啥关系,更多的是前端知识,但是对博客网站都很重要,问的读者也比较多,因此也集中讲一下好了 ...
- 10分钟利用django搭建一个博客
以前老是听说ROR开发有多快多块,网上还有朋友为了证明这,专门制作了10分钟利用rails框架搭建一个简易博客的教程,最近学习django框架,觉得django给开发者的便捷也很多,心血来潮来写个10 ...
- 基于django的个人博客开发
基于django开发个人博客系统 这里只放了一个应用的相关操作方式,当然有问题或者错误都可以评论找我们可以一起debug哦 这是个人博客开发的展示哦 1.配置相关环境开发利用python3.7以及na ...
最新文章
- liunx tar安装mysql_在Linux下,安装Mysql(tar)
- wdtree简介、使用
- poj 1515+poj 1438(边双连通)
- [LeetCode]题解(python):025-Reverse Nodes in k-Group
- awk学习笔记(10) - 数组
- SQLErrorCodeSQLExceptionTranslator 使用以下的匹配规则
- yml文件配置mysql表大小写_springboot常用配置(yml文件)
- 为知笔记:优秀国产知识管理软件的使用心得
- python nlp data_Python nlpaug包_程序模块 - PyPI - Python中文网
- 安卓获取浏览器上网记录_在android中获取浏览器历史记录和搜索结果
- SSRF攻击实例解析
- http get和post的区别
- 预训练语言模型关系图+必读论文列表,清华荣誉出品
- 远程桌面中断解决技巧
- Android Java开发实例项目+游戏视频教程免费下载咯。。
- HTML网页设计:导航栏
- iOS面试--最新快手iOS面试题
- 美资软件公司JAVA工程师电话面试题目
- 未转变者怎么调服务器难度,未转变者服务器怎么设置出生点 | 手游网游页游攻略大全...
- 拉格朗日乘子法和KTT条件
热门文章
- 深入实践Spring Boot1.3.2 一个简单的实例
- Javascript中DOM技术的的简单学习
- CSS/font-size和line-height属性继承的研究
- C#线程系列讲座(1):BeginInvoke和EndInvoke方法
- go标准库的学习-time
- 用友云微服务架构下配置文件管理利器:配置中心
- 【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
- php之static静态变量详解
- 《黑客秘笈——渗透测试实用指南(第2版)》目录—导读
- C#Winform窗体中传值