个人博客的简单搭建

来源:互联网 发布:王坚阿里云博士别哭 编辑:程序博客网 时间:2024/05/22 06:47
关于Djingo这个web框架是利用MTV格式,‘M’是models(模型),‘T’则是templates(模板),‘V’是views(视图),而'M'是和数据库关联的地方,'T'是web中存放静态页面的,html,css,js什么的,‘V’则不得了,这个是对页面要展示的模样的**逻辑处理**。先利用Djingo创建一个项目,然后给这个项目注册一个APP(在tools里面运行manage.py这个文件,然后在里面 startapp _app),再重新创建下数据库.在建数据库之前先在sitting里面设置好数据库的连接,比如我用的是mysql的数据库,进行修改如下
DATABASES = {    'default': {        #使用的数据库是mysql        'ENGINE': 'django.db.backends.mysql',        #数据库里面建的库的数据库命为CSDN        'NAME': 'csdn',        #选择数据库的地址是本地        'HOST':'localhost',        #端口是3306        'POST':'3306',        #用户命和密码        'USER':'root',        'PASSWORD':'root',    }}```然后接着在manage.py里面运行以下两条代码<div class="se-preview-section-delimiter"></div>

makemigrations
migrate
``在urls.py里面设置浏览器的url对应到路由的设置
urlpatterns = [
url(r’^admin/’, admin.site.urls),
url(r’^$’, views.index),]
把静态页面放进templates这个文件夹里面,这里我的静态页面是list.html和datail.html,然后接着在views里面配置展示逻辑,
def index(request):
#通过模型取数据库里的数据
ml = Message.objects.all()
mk =Category.objects.all()
#把数据存进字典里
ctx = {
‘messagelist’:ml,
‘Category’:mk
}
#返回一个html的渲染页面,context在html里面进行for循环取值
return render(request,’list.html’,context=ctx)`
html方面我就不说了,关于for取值是用的Djingo里面的模板语言,可以去了解一下。
这里写图片描述
然后在HTML的表单里获取页面请求,页面查询的时候,使用form表单。form表单有两个关键的属性,分别是method和action。form表单中一定有个submit按钮,用于提交表单。如果要把查询的条件传给后台,那么form表单中一定有个input元素,该元素必须有name属性。这里写图片描述
调用request.POST.get(xxx)获取值,若没有get到值则会报错

def content_t(request):    id = request.GET.get('id')    m = Message.objects.get(id=id)    return render(request, template_name='datail.html', context={'message': m})```在liuyanList.html的每一行记录,使用a标签设置超链接。<a href="/show?id={{ message.id }}">{{ message.title }}</a>当点击的时候,会匹配urls.py中正则表达式/show,找对应的方法show()。在show()方法中,获取id的值,查询数据。def show(request):    id = request.GET.get('id')    m = Message.objects.get(id=id)return render(request, template_name='liuyan.html', context={'message':m})在liuyan.html中,回显数据,一定要把id也写到页面上。为什么?因为通过id可以判断是新增还是修改。<input type="hidden" name="id" value="{{ message.id }}">同理,在后台的save()方法,也是通过id是否存在判断是新增还是修改。def save(request):    id = request.POST.get('id')    title = request.POST.get('title')    content = request.POST.get('content')    if id:        m = Message.objects.get(id=id)        m.title = title        m.content = content        m.save()    else:        m = Message(title=title,                    content=content,                    author='wuchao',                    clicks=0,                    pubdate=timezone.now())        m.save()return redirect(to='/liuyanList/')在这里要记住,新增和修改,都是调用model中的save()方法。在设置中文格式也很重要修改settings.py中的内容

LANGUAGE_CODE = ‘zh-hans’ 显示中文格式
TIME_ZONE = ‘Asia/Shanghai’ 显示当前东八区,即中国时区
USE_TZ = False“`
2.6.1.创建对象的方法
一种是直接对创建的对象进行赋值
m = Message()
m.title = title
m.content = content
m.author = ‘wuchao’
m.clicks = 0
m.pubdate = timezone.now()
m.save()

另一种是调用Message.objects.create(….有名参数…..)
Message.objects.create(title = title,
content = content,
author = ‘wuchao’,
clicks = 0,
pubdate = timezone.now())

最后一种是调用Message(….有名参数….)创建对象,在调用save()方法
m = Message(title = title,
content = content,
author = ‘wuchao’,
clicks = 0,
pubdate = timezone.now())
m.save()
2.6.2.redirect解决重复提交问题
让一个请求在后台处理后,自动重新定向到新的请求。这里写图片描述

正常的请求应答机制,是发送一个请求,后台返回一个应答。
在使用redirect时,发送请求,应答后又发送一个新的请求,后台再次应答。

在views.py定义的函数中,最后返回的是如下形式:

from django.shortcuts import render,redirect,HttpResponse

一般在什么情况下,使用重定向?当请求时增删改操作操作时,一般重定向。

当使用重定向时,通过Firefox浏览器的开发者工具,可以看到如下的2个请求。第1个请求是用户点击页面发起的请求,第2个请求是重定向时自动发起的请求。

2.7.include实现模板的重用
{% include ‘sub/header.html’ %}
2.8.admin后台
2.8.1.增加超级用户
manage.py里输入createsuperuser
对应的是在数据库表auth_user中增加一条记录。
2.8.2.创建MessageAdmin
要想让admin管理我们自己创建的对象,必须在admin.py中增加一些代码。
class MessageAdmin(admin.ModelAdmin):
module = Message

定义了一个对应Message的管理类。然后注册该管理类。
admin.site.register(Message, MessageAdmin)
这样,admin就可以管理我们定义的类了。

如果管理功能更加丰富的话,可以完善MessageAdmin类。
class MessageAdmin(admin.ModelAdmin):
module = Message
list_display = [‘title’, ‘content’, ‘author’, ‘clicks’]
list_filter = [‘title’]
list_editable = [‘content’, ‘clicks’]
3.项目:博客
3.1.外键
class Category(models.Model):
name = models.CharField(max_length=32)

class Articles(models.Model):
title = models.CharField(max_length=64)
category = models.ForeignKey(to=Category, default=1)
这里写图片描述

3.2.模板中的过滤器
在使用{{ 。。。}}显示的时候,如果对显示的结果进行格式化处理(如日期的格式化、数字格式化等等),那么需要使用过滤器。

{{ article.content|truncatechars:’50’ }}

for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

url(r’^archive/category/(\d*)/’, views.search), 这种url格式比较优雅,有利于SEO。

3.3.插件ueditor
https://github.com/twz915/DjangoUeditor3

安装pip install djangouedit 复制…master中的内容覆盖python的SITE中的内容

在settings注册’DjangoUeditor’

在urls中增加url(r’^ueditor/’,include(‘DjangoUeditor.urls’)),

在models中使用
from DjangoUeditor.models import UEditorField
content = UEditorField(‘内容’, height=300, width=1000,
default=u”, blank=True, imagePath=”uploads/images/”,
toolbars=’besttome’, filePath=’uploads/files/’)

在settings最后增加以下语句
MEDIA_URL = ‘/media/’
MEDIA_ROOT = os.path.join(BASE_DIR, ‘media’)

【目前存在上传文件失败的情况】
3.4.权限管理
我们使用django内置的用户认证系统。

user = auth.authenticate(username=username, password=password)
作用是验证提供的用户名、密码是否有效。

auth.login(request, user)
作用是登录到会话中。
差不多前面就已经创建好了微博项目,后面的是对项目做出注意事项。