贴吧是最简单最容易实现的网站功能,我们就先做这个吧。
其实开发所有的功能,大概都是这么一个顺序
一、新建一个app应用
python manage.py startapp tool_03
二、添加settings.py配置
三、建立帖子和评论的模型
#mysite/tool_03/models.py
class Blog(models.Model):
name = models.CharField(max_length=50,default="default name")
user_id = models.IntegerField(default=1)
user_name = models.CharField(max_length=10,default="default name")
content = models.CharField(max_length=500,default="default content")
created_at = models.IntegerField(default=1514879938)
def __str__(self):
return self.name
class Comment(models.Model):
biog_id = models.IntegerField(default=1)
user_id = models.IntegerField(default=1)
user_name = models.CharField(max_length=10,default="default name")
content = models.CharField(max_length=50,default="default content")
created_at = models.IntegerField(default=1514879938)
def __str__(self):
return self.name
四、更新数据库
python manage.py makemigrations
python manage.py migrate
五、注册模型
打开mysite/tool_03/admin.py,在后台注册我们刚写的两个model
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(Blog)
admin.site.register(Comment)
六、访问后台
python manage.py runserver 8003
我忘记密码了于是我重新设置了超级管理员:
python manage.py createsuperuser
然后访问地址http://127.0.0.1:8003/admin/打开后台,如果看到了Blog和Comment,说明成功
七、修改响应函数
#mysite/main/views.py
from tool_03.models import Blog
def index(request):
a=Blog.objects.all().order_by('-id')[:5]
return render(request,"basemain.html",{'blogs':a})
八、修改主页
#main\templates\basemain.html
{% for blog in blogs %}
<article class="article">
<h2><a href="#0"><b>{{blog.name}}</b></a></h2>
<p class="small text-secondary">发表于{{blog.created_at|datetime}}</p>
<p class="text-secondary">{{blog.content}}</p>
<p><a href="/blog/{{blog.id}}">继续阅读<i class="uk-icon-angle-double-right"></i></a></p>
</article>
<hr class="article-divider">
{% enpty %}
<h2>暂无通知</h2>
{% endfor %}
九、访问主页
注意看,Invalid filter:‘datetime’,我们错在哪里了?没错,就是这个{{ blog.created_at|datetime }},你写了datetime,却没有注册,这怎么可能跑得通呢?所以我们要写这个filter:在main文件夹里新建一个叫templatetags的文件夹,并加入如下几个文件(不要加入__pycache__文件夹,否则出错)
之后打开poll_extras.py,写如下内容
from django import forms, template
import time
from datetime import datetime
register = template.Library()
@register.filter(name="datetime")
def datetime_filter(t):
delta = int(time.time()-t)
if delta <60:
return u'1分钟前'
if delta <3600:
return u'%s分钟前' % (delta//60)
if delta <8640:
return u'%s小时前' % (delta//3600)
if delta <604800:
return u'%s天前' %(delta//8640)
dt=datetime.fromtimestamp(t)
return u"%s年%s月%s日"%(dt.year,dt.month,dt.day)
注意那句delta = int(time.time() -t),如果你什么输入数据也没有(比如引用了引用了不存在的blog),是会在这里报错的。但是请不要怀疑,我们的代码没问题,你只是没输入数据。接下来,我们在主页里加上一句
十、完善帖子功能
首先我们新建一个网页。当然了,仍然要有{% extends ‘basemain.html’ %}{% block title %} 发帖 {% endblock %}{% block title2 %} 发帖 {% endblock %}这三行。接下来,在block content里面输入如下内容
{% block content %}
<div id='app' class="form-group">
<label class="form=label">标题</label>
<div class="forn-controls">
<input v-model="name" type="text" placeholder="标题" class='form-controls'>
</div>
<label class="form=label">内容</label>
<div class="forn-controls">
<textarea v-model="content" rows="8" placeholder="标题" class='form-controls' style="resize:none;"></textarea>
</div>
<br>
<button @click="send" class="btn btn-primary"><i class="fa fa-save"></i>发布</button>
</div>
{% endblock %}
接下来要写发帖按钮的响应函数,在block vuejs里面这么写
{% block vuejs %}
<script type="text/javascript">
var vm=new vue({
el:'#app',
data:{
name:'',
content:'',
}
methods:{
send(){
data_to_send={
name:this.name,
content:this.content,
};
console.log(data_to_send);
data_to_send=JSON.stringify(date_to_send);
console.log(data_to_send);
$.post('/tool_03/',
data_to_send,
function(r, err){
if(err === 'success') {
alert('修改乙发布')
return location.assign('/');
}else {
return console.log(err);
}
});
},
});
})
</script>
{% endblock %}
写完这些后,前端的部分就写完了。接下来是后台部分,我们打开tool_03/view.py,开始写函数。这个函数的作用是对我们发的帖子进行接收和处理:
from django.shortcuts import render
from diango.contrib.auth.decorators import login_required
from diango.http import JsonResponse
from .models import *
import ison,time
# Create your views here.
@login_required(login_url='/accounts/login/')
def tool_03(request):
if request.method == "POST":
a=json.loads(request.body.decode('utf-8'))
print(a)
Blog.objects.create(name=a['name'],user_id=request.user.id,user_name=request.user.name,
content=a['content'],content_at=int(time.time()))
return JsonResponse({'ok':'ok']},safe=False)
return render(request,'tool_03_01.html')
def view_blog(request,blog_id=0):
print(blog_id)
return render(request,'tool_03_02.html')
此处值得注意的是:函数分为POST和GET两部分。当函数收到请求的时候,会先判断你发的请求(request)是POST还是GET,如果是GET(进入发帖页面时发送的request)则跳到下边去,返回发帖页面tool_03_01.html,反之则进入POST模块,对发来的帖子进行解析,并存入数据库。所以这个函数才会有两个return。
十一、评论功能
url.py里添上入口
最终效果分为三部分:上面看贴,中间写评论,下面看评论。也就是说我们任何部分的代码(Html/Bootstrap,VueJs,Django)都应该是三部分。
首先是页面布局(Html/Bootstrap)
vue的部分
Django部分
tool_03是发帖函数,刚才我们写过了,不管。下边这个view_blog才是评论函数。同样的,它也分两部分,GET的部分用来看贴看评论,POST的部分用来发评论,用if进行判断,最终有两个return。以后所有的django函数基本上都会是这个样子,一个入口,一个if,两个部分,两个return。