最近刚开始学习django,本人菜鸟为了以后能快速回忆起来,现将开发基本流程总结如下:
注意事项:
1、如果模板有变化要重新迁移(根据模板生成数据库表),如果要迁移的数据库中不为空,则迁移失败,需要清空数据库。
2、在这个编辑器中的tab键和空格可能不标准,使用该代码时要统一变为空格缩进。
###开发流程开始!
--创建虚拟环境:
mkvirtualenv h2
--进入虚拟环境,安装django包:
pip install django
--在合适的目录下创建项目:
django-admin startproject test2
--在虚拟环境中安装mysql-python包:
pip install mysql-python
--登录mysql数据库,创建一个新数据库:
create database test2;
--在setting.py中修改数据库配置为:
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME':'test2',
'USER':'root',
'PASSWORD':'000000',
'HOST':'localhost',
'PORT':'3306',
}
}
--创建应用:
(h2) xuewudu@xuewudu:~/PycharmProjects/project2/test2$ python manage.py startapp booktest
--在setting.py中将应用booktest添加到最后一行,结果为:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booktest',
]
--在models.py中定义模型类:
根据实际定义,也就是定义表结构。在此全部代码为:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class BookInfoManager(models.Manager):
def get_queryset(self):
return super(BookInfoManager,self).get_queryset().filter(isDelete=False)
def create(self,btitle,bpub_date):
b=BookInfo()
b.btitle=btitle
b.bpub_date=bpub_date
b.bread=0
b.bcommet=0
b.isDelete=False
return b
class BookInfo(models.Model):
btitle=models.CharField(max_length=20)
bpub_date=models.DateTimeField(db_column='pub_date')
bread=models.IntegerField(default=0)
bcommet=models.IntegerField(null=False)
isDelete=models.BooleanField(default=False)
class Meta:
db_table='bookinfo'
books1=models.Manager()
books2=BookInfoManager()
@classmethod
def create(cls, btitle, bpub_date):
b = BookInfo()
b.btitle = btitle
b.bpub_date = bpub_date
b.bread = 0
b.bcommet = 0
b.isDelete = False
return b
def __str__(self):
return self.btitle.encode('utf-8')
class HeroInfo(models.Model):
hname=models.CharField(max_length=10)
hgender=models.BooleanField(default=True)
hcontent=models.CharField(max_length=1000)
isDelete=models.BooleanField(default=False)
book=models.ForeignKey(BookInfo)
def __str__(self):
return self.hname.encode('utf-8')
--生成迁移(两条语句依次执行):
(h2) xuewudu@xuewudu:~/PycharmProjects/project2/test2$ python manage.py makemigrations
(h2) xuewudu@xuewudu:~/PycharmProjects/project2/test2$ python manage.py migrate
此时数据库中已经自动生成表。
--在views.py中编写如下代码:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from models import *
from django.shortcuts import render
from django.db.models import Max,F,Q
# Create your views here.
def index(request):
#list = BookInfo.books1.filter(heroinfo__hcontent__contains='八') #某本书的英雄的结束包含‘八’的查询出来
#list = BookInfo.books1.filter(pk__lte=2) #查询编号小于等于2的
#list = BookInfo.books1.filter(bread__gte=0) #查询阅读量大于等于0的
list = BookInfo.books1.filter(bread__lte=F('bcommet')) #查询阅读量小于等于评论量的,不同属性比较使用F
#list = BookInfo.books1.filter(bread__lte=4,btitle__contains='1') #这两句效果相同,表示并列
#list = BookInfo.books1.filter(bread__lte=4).filter(btitle__contains='1')
list = BookInfo.books1.filter(Q(bread__lte=4) | Q(btitle__contains='1') #这句表示并列,使用Q
Max1 = BookInfo.books1.aggregate(Max('bpub_date')) #查询最大的date,在index.html显示到Max1标签中
context={'list':list,'Max1':Max1}
return render(request,'booktest/index.html',context)
--在project2/test2/booktest下新建文件urls.py
--在project2/test2/test2中的urls.py中将上面新建的urls.py添加进去,全部代码如下:
from django.conf.urls import include,url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^',include('booktest.urls')), #新添加部分
]
--在project2/test2/booktest/urls.py中添加url地址映射,全部代码如下:
from django.conf.urls import url
import views
urlpatterns = [
url(r'^$',views.index)
]
--在项目文件夹(test2)下新建文件夹路径为project2/test2/templates/booktest,(最后一个文件夹
要和应用同名,在此为booktest)在这个文件夹中新建index.html文件,编写相应代码,在此全部代码为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for book in list %}
<li>
{{ book.btitle }}
</li>
{% endfor %}
</ul>
<hr>
{{ Max1 }}
</body>
</html>
--在settings.py的TEMPLATES列表中添加模板路径,部分代码为:
TEMPLATES = [
{
......
'DIRS': [os.path.join(BASE_DIR,'templates')],
......
},
]
--在admin.py中配置登录页面,用法为admin.site.register(模型类,admin类),在此全部代码为:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from models import *
# Register your models here.
class HeroInfoInline(admin.TabularInline):
model = HeroInfo
extra = 3
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['id','btitle','bpub_date','bcommet']
list_filter = ['btitle']
search_fields = ['btitle']
list_per_page = 10
fieldsets = [
('base',{'fields':['btitle']}),
('super',{'fields':['bpub_date','bcommet']})
]
inlines = [HeroInfoInline]
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo)
--在虚拟环境h2中创建超级管理员,命令如下:
python manage.py createsuperuser
--在虚拟环境h2中启动服务器,命令如下:
python manage.py runserver
--打开浏览器输入120.0.0.1:8000就可以进入到Django主页面了。