环境创建
创建虚拟环境:
conda create -n django python==3.6
进入环境:
source activate django
安装Django:
pip install Django ==1.10
创建Django工程:
数据库迁移(文件数据库):
python manage.py makemigrations
python manage.py migrate
运行Django项目:(默认端口是8000)
python manage.py runserver
若修改端口直接在其后加端口即可
python manage.py runserver 9000
环境优化(语言及时区):
在settings.py里边修改:
LANGUAGE_CODE = ‘zh-hans’
TIME_ZONE = ‘Asia/Shanghai’
创建一给超级用户:
python manage.py createsuperuser
进入后台管理系统:
创建第一个app:book
创建app:
python manage.py startapp book
创建数据库表:
models.py
from django.db import models
# Create your models here.
# 关联关系: 书籍:人物====> 1:n
# 书籍
class BookInfo(models.Model):
# id如果没有指定, 默认会添加id并作为主键(primary_key(pk))
btitle = models.CharField(max_length=50, unique=True, verbose_name="图书名称") # 图书名称, 并限定最大长度为50;
bpub_date = models.DateField(verbose_name="出版日期")
# 添加书籍的详解
bcontent = models.TextField(default="书籍摘要")
# 添加图片, 并指定上传图片存放位置; # hello.jpg ==== static/uploads/hello.jpg
bimg = models.ImageField(default=None, upload_to='static/uploads/')
class Meta:
# 后台的单数显示
verbose_name = "图书信息"
# 后台的复数显示, 如果不指定, 在单数后面默认加s;
verbose_name_plural = "图书信息"
def __str__(self):
return "%s" %(self.btitle)
# 书籍中的英雄人物
class HeroInfo(models.Model):
hname = models.CharField(max_length=50, verbose_name="人物名称")
hgender = models.BooleanField(verbose_name="性别")
hcontent = models.TextField(verbose_name="人物介绍") # 人物介绍
# 多的一端写外键
hbook = models.ForeignKey(BookInfo, verbose_name="所属书籍")
@property
def gender(self):
if self.hgender:
return "男"
else:
return "女"
class Meta:
verbose_name = "人物信息"
verbose_name_plural = "人物信息"
def __str__(self):
return "%s" %(self.hname)
激活模型:
settings.py文件:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book'
]
数据库迁移到本机的mysql数据库中:
settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
# 数据库名称;
'NAME': 'DjangoProject',
'USER': 'cooffee',
'PASSWORD': 'cooffee',
'HOST': 'localhost',
'PORT': '3306',
}
}
在主项目的__init__.py文件中:
因为该版本的Django识别的是MySQLdb,而我门用的是python3,所以要把pymsql伪装为MySQLdb
import pymysql
pymysql.install_as_MySQLdb()
进行数据库迁移
python manage.py makemigrations
python manage.py migrate
mysql数据库信息检测:
若没有使用本机mysql数据库,那么根据原来settings.py内容:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
可知道数据迁移到文件数据库db.sqlite3中。
进行数据检测:
进入python shell
python manage.py shell
可对数据进行增删改查:
表明数据库迁移到db.sqlite3成功
新建图书信息:
查询及输出图书信息:
修改图书信息:
b.btitle=u"天龙八部"
b.save()
删除图书信息:
b.delete()
关联对象的操作:
添加关联对象:
获得关联集合:
添加关联对象的另一个操作:
后台管理:
在book/admin.py:
from django.contrib import admin
# Register your models here.
from book.models import BookInfo, HeroInfo
#关联注册
# 在书籍添加表单中增加行内表单(添加人物)
class HeroInline(admin.TabularInline):
model = HeroInfo
extra = 3
class BookInfoAdmin(admin.ModelAdmin):
#显示字段
list_display = ['btitle', 'bpub_date']
inlines = [HeroInline]
class HeroInfoAdmin(admin.ModelAdmin):
# 显示字段
list_display = ['hname', 'hcontent', 'hbook', 'gender']
#过滤字段,过滤框会出现在右侧
list_filter = ['hname']
#搜索字段,搜索框会出现在上侧
search_fields = ['hname', 'hcontent']
#分页,分页框会出现在下侧
list_per_page = 2
#注册模型
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(HeroInfo, HeroInfoAdmin)
URL设置
djangoproject/urls.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
#r后的为正则表达式,匹配到之后去找book.urls的内容
url(r'^$', include('book.urls')),
url(r'book/', include('book.urls')),
]
book/urls.py:
from django.conf.urls import url
from book import views
#命名空间
app_name = 'book'
urlpatterns = [
url(r'^$', views.index),
url(r'^(?P<id>\d+)/$', views.detail)
]
视图函数
bool/views.py:
from django.shortcuts import render
# Create your views here.
from book.models import BookInfo
# 在flask里面, 默认请求是request
# Django里面的请求对象必须作为参数接收
def index(request):
books = BookInfo.objects.all()
return render(request,'blog/index.html',context={'books':books})
def detail(request,id):
# 1). 查询指定id对应的书籍对象
book = BookInfo.objects.get(id=id)
# 2). 根据数据关联关系, 获取该书籍中包含的所有人物信息
heros = book.heroinfo_set.all()
return render(request,'blog/detail.html',
context={
'book':book,
'heros':heros
})
html:
在settings.py中设置:
为了找到static的设置,static存css,js等样式。当前项目的static文件夹
为了找到html存放的位置,设置为os.path.join(BASE_DIR, ‘templates’)当前项目的templates文件夹
各个html的内容:
base.html:
<!DOCTYPE HTML>
<html>
<head>
<title>{% block title %} {% endblock %}</title>
<link href="/static/css/style.css" rel="stylesheet" type="text/css" media="all" />
</head>
<body>
<!---start-wrap--->
<div class="wrap">
<!---start-header--->
<div class="header">
<!---start-logo--->
<div class="logo">
<a href="index.html"><img src="/static/images/logo.png" title="logo" /></a>
</div>
<!---End-logo--->
<!---start-head-social-icons--->
<div class="top-social-icons">
<div class="social-icons">
<ul>
<li><a href="#"><img src="/static/images/facebook1.png" title="facebook" /></a></li>
<li><a href="#"><img src="/static/images/twitter1.png" title="Twitter" /></a></li>
<li><a href="#"><img src="/static/images/youtube1.png" title="Youtube" /></a></li>
</ul>
</div>
<div class="clear"> </div>
</div>
<div class="clear"> </div>
<!---End-head-social-icons--->
<!---start-top-nav---->
<div class="top-nav">
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="elements.html">About us</a></li>
{# <li><a href="elements.html">Our Purpose & Objective</a></li>#}
{# <li><a href="elements.html">Membership</a></li>#}
<li><a href="elements.html">Asian & Wellness Forum</a></li>
<li><a href="search.html">Search</a></li>
<li><a href="contact.html">Contact</a></li>
<div class="clear"> </div>
</ul>
</div>
<!---End-top-nav---->
{% block content %}
{% endblock %}
<!---End-Content---->
<!---start-sidebar---->
<div class="side-bar">
<div class="sidebar-top-add">
<h3>Sponsersed by</h3>
<a href="#"><img src="/static/images/add2.png" title="add"/></a>
</div>
<div class="presedent-img">
<div class="Latest-news-title side-bar-sub-heading">
<h3>Form the desk of President</h3>
<h5> </h5>
<div class="clear"> </div>
</div>
<a href="#"><img src="/static/images/prasedent.png" title="name" /></a>
</div>
<div class="sponsers-list">
<h3>Sponsersed by</h3>
<a href="#"><img src="/static/images/spons1.png" title="sponser-name" /></a>
<a href="#"><img src="/static/images/spons1.png" title="sponser-name" /></a>
</div>
</div>
<div class="clear"> </div>
<!---End-sidebar---->
</div>
<!---End-main---->
</div>
<!---start-footer---->
<div class="footer">
<div class="footer-nav-grid">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About us</a></li>
<li><a href="#">Our Purpose & Objective</a></li>
<li><a href="#">Membership</a></li>
<li><a href="#">Asian & Wellness Forum</a></li>
<li><a href="#">Courses</a></li>
<li><a href="#">Contact</a></li>
<div class="clear"> </div>
</ul>
</div>
<div class="footer-social-icons">
<ul>
<li><a href="#"><img src="/static/images/facebook.png" title="facebook" /></a></li>
<li><a href="#"><img src="/static/images/twitter.png" title="twitter" /></a></li>
<li><a href="#"><img src="/static/images/youtube.png" title="Youtube" /></a></li>
</ul>
</div>
<div class="footer-form">
<h3>Quick Contact</h3>
<form>
<div class="footer-text-boxs">
<input type="text" class="textbox" value="Name:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Name';}">
<input type="text" class="textbox" value="Email:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Email';}">
<input type="text" class="textbox" value="mobile:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'mobile';}">
<input type="text" class="textbox" value="Website:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Website';}">
</div>
<div class="footer-text-area">
<textarea value="Message:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Message';}">Message</textarea>
</div>
<input type="submit" value="Call Me">
</form>
</div>
<div class="clear"> </div>
</div>
<!---End-footer---->
<!---End-wrap--->
</body>
</html>
blog/index.html:
% extends 'base.html' %}
{% block title %} 首页{% endblock %}
{% block content %}
<!---start-main---->
<div class="main">
<!---start-Content---->
<div class="content">
<div class="image-slider">
<h3>Featured</h3>
<div class="container">
<div id="slides">
<img src="/static/images/slider1.jpg" alt="">
<img src="/static/images/slider2.jpg" alt="">
<img src="/static/images/slider3.jpg" alt="">
<img src="/static/images/slider4.jpg" alt="">
<a href="#" class="slidesjs-next slidesjs-navigation"><i
class="icon-chevron-right icon-large"></i></a>
</div>
</div>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="/static/js/jquery.slides.min.js"></script>
<script>
$(function () {
$('#slides').slidesjs({
width: 940,
height: 285,
navigation: false
});
});
</script>
</div>
<div class="clear"></div>
<div class="Latest-news">
<div class="Latest-news-title">
<h3>Latest Happening @ mawspa</h3>
<h5></h5>
<div class="clear"></div>
</div>
{% for book in books %}
<div class="blog-articals">
<div class="artical">
<div class="artical-heading">
<a href="/book/{{ book.id }}/"><h3>{{ book.btitle }}</h3></a>
<h4><span>Post On</span> {{ book.bpub_date }}</h4>
</div>
<div class="artical-box">
<div class="artical-img">
<a href="/book/{{ book.id }}/"><img src="/{{ book.bimg }}" title="imag-name"/></a>
</div>
<div class="artical-info">
<p>{{ book.bcontent }}
<a href="/book/{{ book.id }}/">Read more...</a></p>
</div>
<div class="clear"></div>
</div>
</div>
</div>
{% endfor %}
</div>
<a class="button" href="#">View All Updates</a>
</div>
</div>
<!---End-Content---->
{% endblock %}
blog/detail.html:
{% extends 'base.html' %}
{% block title %} 人物信息 {% endblock %}
{% block content %}
<!---start-main---->
<div class="main">
<!---start-Content---->
<div class="content">
<div class="basic-elements">
<div class="sub-wrap">
<div class="footer-form">
<h3 style="font-size: 50px;text-align: center ">{{ book.btitle }}</h3>
</div>
{% for hero in heros %}
<div class="common-heading">
<h1>{{ hero.hname }}</h1>
</div>
<div class="headings">
<p>{{ hero.hcontent }}</p>
</div>
{% endfor %}
</div>
<br>
</div>
<div class="clear"></div>
</div>
</div>
<!---End-Content---->
{% endblock %}