s10_part3_django_basic.md

s10_part3_django_basic

返回顶部

django安装

mkdir -p ~/PycharmProjects/project/Django2.0
cd ~/PycharmProjects/project/Django2.0
virtualenv mysite-env
source mysite-env/bin/activate
pip install django==1.11.11
pip list
deactivate #退出虚拟环境

startproject

django-admin startproject mysite
tree mysite

mysite/
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

返回顶部

初识mysite.mysite.urls.py

cat urls.py

from django.conf.urls import url
from django.contrib import admin

#为了避免自己写http协议的socket,这里直接引用 django的HttpResponse
from django.shortcuts import HttpResponse

def test_url(request):  #自定义一个函数,request代表所有的http请求,可以是任务字符,通常习惯上使用request
    return HttpResponse("hello world!")   #返回一串字符


urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^test_url/', test_url),
]

返回顶部

启动django服务器

命令行中输入python manage.py runserver //启动服务器
再浏览器中输入:http://127.0.0.1:8000/test_url/
即可到返回的字符串:hello world!

配置 mysite.mysite.settings.py

settings.py中默认存在:BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

所有的html相关文件的设置都在这里
注意:填写DIRS采用这种内置函数的方式   'DIRS': [os.path.join(BASE_DIR,'templates')],
不要使用字符串拼接,因为不确定运行的操作系统的路径分隔符
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

所以在BASEDIR(即这里的mysite)下新建一个文件夹templates,然后将html文件放置于这个文件夹中即可

使用render返回网页

cat urls.py

from django.conf.urls import url
from django.contrib import admin

#为了避免自己写http协议的socket,这里直接引用 django的HttpResponse
from django.shortcuts import HttpResponse, render

def test_url(request):  #自定义一个函数,request代表所有的http请求,可以是任务字符,通常习惯上使用request
    return HttpResponse("hello world!")   #返回一串字符


def test_url2(request):
    return render(request,"url2.html")  #返回html文件

    #如果url2.html的位置是在templates下的某一个文件夹XX
    #那么改为:return render(request,"xx/url2.html") 即可


# 返回渲染的html与以下读取文件,返回字符串的效果相同
def test_url3(request):
    # with open("xx/url2.html",'rb') as f:   #等价于下一写法
    with open("xx/url2.html",'r',encoding='utf-8') as f:
        data = f.read()
    return HttpResponse(data)



urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^test_url/', test_url),   #前面部分为访问的url,后面为调用的函数名
    url(r'^test_url2/', test_url2),
    url(r'^test_url3/', test_url3),
]

返回顶部

startapp

为了代码的模块化,功能化,维护更便捷,因此采用django app的方式构建整个项目
在开启一个项目后后根据功能模块创建django APP,这里创建一个名为library的app

cd mysite
python manage.py startapp library

tree ../mysite
mysite/
├── library
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py


返回顶部

注册已创建的django APP

vim mysite.mysite.settings.py

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 'library', 此种写法与下面效果一样,二选其一,但推荐下面一种写法
    'library.apps.LibraryConfig'  #推荐的写法
]

配置连接MySQL数据库

django不能自动创建数据库,因此需要手动创建数据库

mysql -u root -p -H $host -P $port
create database mysite default charset utf8;
show databases;

配置连接MySQL数据库
vim mysite.mysite.settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'USER':'root',
        'PASSWORD':'Pw123456',
        'NAME': 'mysite',
    }
}

返回顶部

使用pymysql连接数据库

这里设置django中使用pymysql代替默认使用的MySQLdb连接数据库
修改mysite.mysite.init.py

import pymysql
pymysql.install_as_MySQLdb()

在开发环境中安装pymysql:

pip3 install pymysql

在django app下的models.py中定义类

这个类必须继承models.Model
mysite.library.models.py

from django.db import models

#每个类分别对应数据库中的表,每个属性对应为表中字段,数据表中的第条记录对应为类的一个实例化对象
# Create your models here.
class UserInfo(models.Model):
    id = models.AutoField(primary_key=True)  #创建一个自增的字段,并设置为主键
    name = models.CharField(null=False,max_length=20)  #创建一个varchar类型的字段,不能为空,最多20个字符串

返回顶部

使用ORM执行SQL命令

在项目根目录下执行

python3 manage.py makemigrations
python3 manage.py migrate

展示用户列表

在mysite.mysite.urls.py中增加以下内容

from library import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^user_list/', views.user_list),
]

在mysite.library.views.py中增加以下内容

from django.shortcuts import render
from library import models


# Create your views here.

# 展示所有用户的的函数
def user_list(request):
    # 取出所有数据,实列化为每个相应的对象,放入一个列表中
    # order_by("id")可以使查询的数据以ID从小到大排序
    ret = models.UserInfo.objects.all().order_by("id")
    # print(ret)
    # print(ret[0].id, ret[0].name)  #提取每个对应的属性值打印到控制台
    # 传一个字典给网页模板,模板渲染后展示给用户
    return render(request, "user_list.html", {"user_list": ret})


在mysite.templates目录下,创建user_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>user list</title>
</head>
<body>
<table border="1">
    <tr>
        <th>序号</th>
        <th>id值</th>
        <th>姓名</th>
    </tr>
    <tbody>
    {% for user in user_list %}
    <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ user.id }}</td>
        <td>{{user.name}}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>

返回顶部

添加用户

在mysite.mysite.urls.py中的urlpatterns里增加以下内容

    url(r'^add_user/', views.add_user),

在mysite.library.views.py中增加以下内容

from django.shortcuts import render, HttpResponse,redirect

# 添加用户的函数
def add_user(request):
    if request.method == 'POST':
        # 用户填写了新的用户名,并发送了POST请求过来
        new_name = request.POST.get("username", None)
        # 用数据库中创建一条用户记录
        models.UserInfo.objects.create(name=new_name)
        # 返回添加成功
        # return HttpResponse("添加成功")
        # 或者返回用户展示页面
        return redirect("/user_list/")
    # 第一个请求页面时,返回一个页面,页面上有个框让用户填写需要新建的用户名
    return render(request, "add_user.html")

在mysite.templates目录下,创建add_user.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加用户</title>
</head>
<body>
<form action="/add_user/" method="post">
    <p>username:
        <input type="text" name="username">
    </p>
    <p>
        <input type="submit" value="提交">
    </p>
</form>
</body>
</html>

修改mysite.templates.user_list.html,增加添加用户的超链接入口

<body>
<!--在user_list面面添加以下添加用户的超链接即可-->
<a href="/add_user/">添加用户</a>

<table border="1">
<!--以下HTML省略未粘贴-->

返回顶部

删除用户

在mysite.mysite.urls.py中的urlpatterns里增加以下内容

    url(r'^delete_user/', views.delete_user),

在mysite.library.views.py中增加以下内容

# 删除用户的函数
def delete_user(request):
    # 删除指定数据
    # 从GET请求参数里面拿到将要删除的数据的ID值
    del_id = request.GET.get("id", None)
    # 如果取到了ID值
    if del_id:
        # 根据这个ID值去数据库找到数据对象
        del_obj = models.UserInfo.objects.get(id=del_id)
        # 调用该对象的delete方法删除数据对象
        del_obj.delete()
        # 返回删除后的用户展示页面
        return redirect("/user_list/")
    else:
        return HttpResponse("要删除的数据不存在!")

修改mysite.templates.user_list.html,增加删除用户的超链接入口

<body>
<!--在user_list面面添加以下添加用户的超链接即可-->
<a href="/add_user/">添加用户</a>
<table border="1">
    <tr>
        <th>序号</th>
        <th>id值</th>
        <th>姓名</th>
        <th>操作</th>
    </tr>
    <tbody>
    {% for user in user_list %}
    <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ user.id }}</td>
        <td>{{user.name}}</td>
        <!--在user_list面面增加以下删除用户的超链接即可-->
        <td><a href="/delete_user/?id={{user.id}}">删除</a></td>
    </tr>
    {% endfor %}
    </tbody>
</table>
</body>

返回顶部

编辑用户

在mysite.mysite.urls.py中的urlpatterns里增加以下内容

    url(r'^edit_user/', views.edit_user),

在mysite.library.views.py中增加以下内容

# 编辑用户的函数
def edit_user(request):
    error_msg = ""
    # 用户修改完用户名,点击提交按钮,发送给服务器新的用户名
    if request.method == "POST":
        # print(request.POST) #打印POST的数据到控制台
        # 取出用户的ID,新的用户名
        edit_id = request.POST.get("id", None)
        new_name = request.POST.get("username", None)
        # 根据ID取到要编辑的用户对象
        edit_obj = models.UserInfo.objects.get(id=edit_id)
        edit_obj.name = new_name
        edit_obj.save()  # 将修改提交到数据数据库保存
        # 跳转到用户展示页面,查看是否修改成功
        return redirect("/user_list/")

    edit_id = request.GET.get("id", None)
    if edit_id:
        # 获取当前编辑的用户对象
        edit_obj = models.UserInfo.objects.get(id=edit_id)
        return render(request, "edit_user.html", {"user": edit_obj})
    else:
        error_msg="编辑的用户不存在!"
        return render(request,"edit_user.html", {"err_msg":error_msg})


在mysite.templates目录下,创建edit_user.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑用户</title>
</head>
<body>
<h1>编辑姓名</h1>
<form action="/edit_user/" method="post">
    <p><input type="text" name="id" value="{{ user.id }}" style="display:none"></p>
    <p><input type="text" name="username" value="{{ user.name }}"></p>
    <p><input type="submit" value="提交" ></p>
    <p>{{err_msg}}</p>
</form>
</body>
</html>

附:

## 静态文件配置项STATICFILES_DIRS

默认此项配置位于settings.py的最后

#此项是静态文件保存目录的别名,这个static就代表了下面STATICFILES_DIRS列表中的所有路径
#因此在html中引用static下的CSS文件时,只需要写static/path/to/css/file即可
STATIC_URL = '/static/'

#添加如下静态文件项,将所有的静态文件(js,css,images)都放在下面配置的路径中

STATICFILES_DIRS = [
os.path.join(BASE_DIR,"static_library")
os.path.join(BASE_DIR,"static_test")
]

例如:

static_illustration

pycharm连接MySQL工具的使用

1.在pycharm菜单栏上点[Views],然后勾选[Tool Button]
2.在窗口最右边出现ToolButtion的工具栏,选Database栏
3.依次点[+]->[Data Source]
4.在弹出窗口中填写相应的MySQL数据库的信息
5.初次使用时,需要下载驱动,即:点击下方的[Download missing driver files]
6.点[OK]后,即可可视化操作MySQL的数据库

帮助命令


python manage.py help //查看帮助命令
python manage.py migrate //初始化默认数据库
python manage.py createsuperuser //创建超级管理员

posted @ 2018-10-19 00:19  rootid  阅读(163)  评论(0编辑  收藏  举报