一、登陆功能(验证码)

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> &nbsp;&nbsp; <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博客项目相关推荐

  1. 项目5 BBS博客项目

    第一部分:需求分析: 一.需要哪些表 1.用户表 用户名,密码,头像 2.文章表 作者,标题,摘要,发布时间, 3.文章详细 文章,内容 4.评论表 评论文章,评论者,评论时间,评论内容,是谁的子评论 ...

  2. django项目转pyc_Python自动化运维系列:Django搭建小博客

    如何使用Django和Python怎么搭建一个小博客呢? 这是一个简单而困难的问题.简单的原因是,只要做过一次,基本上就能做到举一反三: 困难的原因是有没有用心和耐心去完成这个实验. 如果你成功了,那 ...

  3. Python Web开发:Django+BootStrap实现简单的博客项目

    创建blog的项目结构 关于如何创建一个Django项目,请查看[Python Web开发:使用Django框架创建HolleWorld项目] 创建blog的数据模型 创建一个文章类 所有开发都是数据 ...

  4. 利用django+pycharm开发小型博客项目!!!

    废话不多说,让我王虎剩大将军带领大家利用djang框架开发一个小型的博客项目吧!! 首先,此教程适合的人群为,懂得创建python的虚拟环境,以及拥有少数web前端开发的经验,并且拥有少数的后端编程经 ...

  5. Django day17 博客项目(一)

    一: 博客项目需求分析 首页(显示文章) 文章详情 点赞, 点踩 文章评论 字评论 评论的展示 登录功能(图片验证码) 注册功能(基于form验证,ajax) 个人站点(不同人不同样式,文章过滤) 后 ...

  6. python搭建博客项目思路_Django项目——Blog简易开发入门

    一.模型层 模型层是什么 位于视图与数据库之间 pytho对象与数据库表的转换 为什么需要模型层 屏蔽不同数据库之间的差异 开发者更加专注于业务逻辑的开发 提供多种便捷的工具有利于开发工作 模型层的配 ...

  7. html 两个idv上下居中,Django搭建个人博客:回到顶部浮动按钮、矢量图标、页脚沉底和粘性侧边栏...

    本章集中介绍四个重要的小功能:回到顶部浮动按钮.矢量图标.页脚沉底和粘性侧边栏. 这几个功能与Django基本没啥关系,更多的是前端知识,但是对博客网站都很重要,问的读者也比较多,因此也集中讲一下好了 ...

  8. 10分钟利用django搭建一个博客

    以前老是听说ROR开发有多快多块,网上还有朋友为了证明这,专门制作了10分钟利用rails框架搭建一个简易博客的教程,最近学习django框架,觉得django给开发者的便捷也很多,心血来潮来写个10 ...

  9. 基于django的个人博客开发

    基于django开发个人博客系统 这里只放了一个应用的相关操作方式,当然有问题或者错误都可以评论找我们可以一起debug哦 这是个人博客开发的展示哦 1.配置相关环境开发利用python3.7以及na ...

最新文章

  1. liunx tar安装mysql_在Linux下,安装Mysql(tar)
  2. wdtree简介、使用
  3. poj 1515+poj 1438(边双连通)
  4. [LeetCode]题解(python):025-Reverse Nodes in k-Group
  5. awk学习笔记(10) - 数组
  6. SQLErrorCodeSQLExceptionTranslator 使用以下的匹配规则
  7. yml文件配置mysql表大小写_springboot常用配置(yml文件)
  8. 为知笔记:优秀国产知识管理软件的使用心得
  9. python nlp data_Python nlpaug包_程序模块 - PyPI - Python中文网
  10. 安卓获取浏览器上网记录_在android中获取浏览器历史记录和搜索结果
  11. SSRF攻击实例解析
  12. http get和post的区别
  13. 预训练语言模型关系图+必读论文列表,清华荣誉出品
  14. 远程桌面中断解决技巧
  15. Android Java开发实例项目+游戏视频教程免费下载咯。。
  16. HTML网页设计:导航栏
  17. iOS面试--最新快手iOS面试题
  18. 美资软件公司JAVA工程师电话面试题目
  19. 未转变者怎么调服务器难度,未转变者服务器怎么设置出生点 | 手游网游页游攻略大全...
  20. 拉格朗日乘子法和KTT条件

热门文章

  1. 深入实践Spring Boot1.3.2 一个简单的实例
  2. Javascript中DOM技术的的简单学习
  3. CSS/font-size和line-height属性继承的研究
  4. C#线程系列讲座(1):BeginInvoke和EndInvoke方法
  5. go标准库的学习-time
  6. 用友云微服务架构下配置文件管理利器:配置中心
  7. 【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
  8. php之static静态变量详解
  9. 《黑客秘笈——渗透测试实用指南(第2版)》目录—导读
  10. C#Winform窗体中传值