安装python3
1 | wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz |
安装Django
- 方法一
1
sudo pip3 install Django==2.1
- 方法二 (此方法安装的为最新版本)
1
2git clone https://github.com/django/django.git
sudo pip3 install -e ./django - 检测模块是否安装成功如果安装django2.2以上版本,需要安装SQLite 3.8.3以上版本
1
python3 -c "import django;print(django.get_version())"
创建项目
1 | mkdir myproject |
- 报错
运行的python3 manage.py runserver
出现了报错,django.db.utils.NotSupportedError: URIs not supported
,是SQLite 的原因,SQLite 3.8以前的版本都有这个问题。
查看SQLite的版本,命令如下:
1 | sqlite3 --version |
- 解决办法:
修改/usr/local/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py
的155行的’uri’: True ,True 该给False。
1 | 155 kwargs.update({'check_same_thread': False, 'uri': True}) |
然后重新运行python3 manage.py runserver
然后在浏览器中输入 http://127.0.0.1:8000/
即可看到django创建的网页
但是如果在服务器上,需要修改settings.py脚本中的host地址,
1 | . |
将ALLOWED_HOSTS = []
改为 ALLOWED_HOSTS = ['172.26.0.23']
然后运行python3 manage.py runserver 0.0.0.0:8000
然后在浏览器中输入http://172.26.0.23:8000/
即可看到django创建的网页
创建应用
1 | python3 manage.py startapp blog |
创建完应用,需要进行如下配置:
设置
./mysite/setttings.py
文件,添加blog应用:1
2
3
4
5
6
7
8
9INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]设置 ./blog/models.py文件,其实就是设置数据储存的字段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
class BlogArticles(models.Model):
title = models.CharField(max_length=300)
author = models.ForeignKey(User, related_name="blog_posts", on_delete=models.CASCADE)
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ("-publish",)
def __str__(self):
return self.title运行
python3 manage.py makemigrations
创建模型运行
python3 manage.py migrate
创建数据库
发布博客文章
首先要创建超级用户,设置用户名,邮箱和密码。
1
python3 manage.py createsuperuser
然后运行
python3 manage.py runserver 0.0.0.0:8000
在浏览其中输入http://172.26.0.23:8000/admin/
就会出现下面的界面:
输入刚刚设置的账户和密码即可登录,登录完成的界面如下所示:要想发表博客,需要做如下设置:
编写./blog/admin.py
:1
2
3
4
5
6
7
8
9
10
11
12
13from django.contrib import admin
from .models import BlogArticles
# Register your models here.
class BlogArticlesAdmin(admin.ModelAdmin):
list_display = ("title", "author", "publish")
list_filter = ("publish", "author")
search_fields = ('title', "body")
raw_id_fields = ("author",)
date_hierarchy = "publish"
ordering = ['publish','author']
admin.site.register(BlogArticles,BlogArticlesAdmin)刷新页面,就可以看到发布博客的位置:
显示博客信息
显示文章标题
- 配置./blog/views.py
1
2
3
4
5
6
7from django.shortcuts import render
from .models import BlogArticles
# Create your views here.
def blog_title(request):
blogs = BlogArticles.objects.all()
return render(request, "blog/titles.html", {"blogs":blogs}) - 在./blog/文件夹下创建templates文件夹,并创建如下文件:
1
2
3
4templates
├── base.html
└── blog
└── titles.html - 修改base.html文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<! DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="http://necolas.github.io/normalize.css/">
<link rel="stylesheet" href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css">
</head>
<body>
<div class="container">
{% block content %}
{% endblock %}
</div>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script src="http://libs.baidu.com/boostrap/3.0.3/js/bootstrap.min.js"></script>
</body>
</html> - 修改./templates/blog/titles.html文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21{% extends "base.html" %}
{% block title %}blog titles{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
<h1>我的博客</h1>
</div>
<div class="row">
<div class="col-xs-12 col-md-8">
<ul>
{% for blog in blogs %}
<li>{{ blog.title }}</li>
{% endfor %}
</ul>
</div>
<div class="col-xs-6 col-md-4">
<h2>广告</h2>
<p>跟老齐学:www.itdiffer.com</p>
<img width="200px" src="http://pydi4imsi.bkt.clouddn.com/1001.jpg">
</div>
</div>
{% endblock %} - 修改./mysite/urls.py文件:
1
2
3
4
5
6
7from django.contrib import admin
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls')),
] - 修改./blog/urls.py文件:然后在浏览器中输入
1
2
3
4
5
6from django.conf.urls import url
from . import views
urlpatterns=[
url(r'^$', views.blog_title, name="blog_title"),
]http://172.26.0.23:8000/blog/
即可看到如下界面:
- 配置./blog/views.py
查看文章内容
修改titles.html:
1
2
3{% for blog in blogs %}
<li><a href="{{ blog.id }}">{{ blog.title }}</a></li>
{% endfor %}在./blog/views.py中添加文章请求的函数blog_article():
1
2
3
4def blog_article(request, article_id):
article = BlogArticles.objects.get(id=article_id)
pub = article.publish
return render(request, "blog/content.html", {"article":article , "publish":pub })创建模板./templates/blog/content.html文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18{% extends "base.html" %}
{% block title %}blog article{% endblock %}
{% block content %}
<div class="row text-center vertical-middke-sm">
<h1>{{ article.title }}</h1>
</div>
<div class="row">
<div class="col-xs-12 col-md-8">
<p class="text-center"><span>{{ article.author.username }} </span><span style="margin-left:20px">{{ article.publish }}</span></p>
<div>{{ article.body }}</div>
</div>
<div class="col-xs-6 col-md-4">
<h2>广告</h2>
<p>跟老齐学:www.itdiffer.com</p>
<img width="200px" src="http://pydi4imsi.bkt.clouddn.com/1001.jpg">
</div>
</div>
{% endblock %}修改./blog/urls.py
1
2
3
4
5
6
7from django.conf.urls import url
from . import views
urlpatterns=[
url(r'^$', views.blog_title, name="blog_title"),
url(r'(?P<article_id>\d)/$', views.blog_article, name="blog_detail"),
]然后刷新页面,点击文章标题,即可出现下面的界面:
django的MTV
- M: 模型(Model),即数据存取层,模型是网站项目的基础,主要负责处理与数据相关的事务,如读取、写入数据等。
- T:模板(Template),即表现层,处理与表现相关的事务,例如如何在页面中显示相关内容。
- V:视图(Views),即业务逻辑层,包含存取模型及调取相应模板的相关逻辑, 是 M (模型)和 T (模板)之间的桥梁。当 Django 得到用户的请求后,根据 URL 映射关系调用相应的视图,视图则调用和处理有关数据。与模板相比,视图确定访问者能看到哪些数据,而模板确定怎么看到这些数据(或者说用什么方式看到这些数据)。
参考链接:https://simpleisbetterthancomplex.com/series/beginners-guide/1.11/