虽然之前有过一定的学习,但是再做更深一点的内容还是有很多要学的东西以及很大的难度,所以再已有的实例的情况下,自己亲自动手进行操作,并按照自己的想法实现整个过程。
① 首先,建立一个Django项目的工程(使用django-admin.py startproject ×××)
② 创建app并配置相应的文件(app根据用户的功能模块去划分:manage.py startapp ×××),并在setting.py中添加app等内容。
③ 上面是完成本次工程的基本的操作和配置,接下来就是在已有的配置的基础上,分别完成model模块、views模块、urls模块,可以理解为MVC结构,其中model模块的功能是完成数据库的创建以及框架和数据库之间的默认接口;views模块的功能是负责将数据很好的显示在前端以及控制前端的内容;urls模块的功能则是将各个视图所返回的值能够通过urls模块将其显示在前端。
其大致流程可以描述为如下图所示:
具体开发过程:
① 建表:
表一:(文章)
class Article(models.Model):
#文章表
STATUS_CHOICES = (
('d', 'Draft'),
('p', 'Published'),
)
#标题是一个位置参数
title = models.CharField('标题', max_length = 70)
article = models.TextField('正文')
#auto_now_add设为True表示在文章创建时自动添加 时间(对于DateTimeField)
created_time = models.DateTimeField('创建时间', auto_now_add = True)
#auto_now为True表示每次自动修改时间
modified_time = models.DateTimeField('修改时间', auto_now = True)
#help_text表示在该field被渲染成form是显示帮助信息
abstruct = models.CharField('摘要', max_length = 54, blank = True, null = True, help_text = '可选,如若为空将摘取正文前的54个字符')
#field的choices参数需要的值,choices选项有两个可以选定的值:Draft,Published,但是在数据库中 存储的值是'd'和'p'
status = models.CharField('文章状态', max_length = 1, choices = STATUS_CHOICES)
reviews = models.PositiveIntegerField('浏览量', default = 0)
loves = models.PositiveIntegerField('点赞数', default = 0)
top = models.BooleanField('置顶', default = False)
#on_delete = models.SET_NULL表示在删除某个分类时则该分类对应的外键都删除
category = models.ForeignKey('Category', verbose_name = '分类', null = True, on_delete = models.SET_NULL)
def __str__(self):
return self.title.encode('utf-8')
class Meta:
ordering = ['-modified_time']
表二:(分类表)
class Category(models.Model):
name = models.CharField('类名', max_length = 20)
created_time = models.DateTimeField('创建时间', auto_now_add = True)
modified_time = models.DateTimeField('修改时间', auto_now = True)
def __str__(self):
return self.name
表三:(标签表)
class Tag(models.Model):
#可以为后期实现标签云做基础
name = models.CharField(max_length=100)
def __str__(self):
return self.name
表四:(用户表)
class User(models.Model):
User_name = models.CharField(max_length = 10)
User_password = models.CharField(max_length = 10)
def __str__(self):
return self.User_name
② 视图管理:(选取部分)
视图一:(发表博客)
def contact(request):
L_list = models.Article.objects.all()
if request.method == 'POST':
form = forms.Submit_Article(request.POST)
if form.is_valid():
Article_name = form.cleaned_data['Article_name']
Article_text = form.cleaned_data['Article_text']
models.Article.objects.create(title = Article_name, article = Article_text)
return HttpResponseRedirect('')
else:
form = forms.Submit_Article()
return render(request, 'contact.html', {'form':form, 'literary':L_list})
视图二:(实现登录功能)
def login(request):
L_list = models.User.objects.all()
if request.method == 'POST':
form = forms.Login(request.POST)
if form.is_valid():
User_name = form.cleaned_data['User_name']
User_password = form.cleaned_data['User_password']
#获取的表单数据与数据库进行比较
user = models.User.objects.filter(User_name__exact = User_name, User_password__exact = User_password)
if user:
#成功查找,跳转index
responce = HttpResponseRedirect('/archives')
#将User_name写入浏览器cookie,失效时间为3600
responce.set_cookie('User_name', User_name, 3600)
return responce
else:
#查找失败,还在Login
return HttpResponseRedirect('/index')
#models.User.objects.create(User_name = User_name, User_password = User_password)
return HttpResponseRedirect('')
else:
form = forms.Login()
return render(request, 'index.html', {'form':form, 'literary':L_list})
③ url映射关系:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.home, name = 'home'),
url(r'^(?P<id>\d+)/$', views.detail, name = 'detail'),
url(r'^archives/$', views.archives, name = 'archives'),
url(r'^aboutme/$', views.about_me, name = 'about_me'),
url(r'^tag/(?P<tag>\w+)/$', views.search_tag, name = 'search_tag'),
url(r'^search/$',views.blog_search, name = 'search'),
url(r'^feed/$', views.contact, name = 'RSS'),
url(r'^login/$', views.login, name = 'login'),
]
测试:
发表博客:(保存到数据库)
主页:
归档:将在一定日期内发表的文章收集在一起
博客文章:
站内搜索:
后台监测:
参考资料:
Django学习小组:博客开发实战
(
https://www.jianshu.com/p/3bf9fb2a7e31
)
Django1.8.2文档
(
http://usyiyi.cn/translate/django_182/index.html
)
The Django Book
(
http://djangobook.py3k.cn/2.0/
)