django初学习

django day1
1:介绍架构
  通过 pycharm 创建 django 项目,或者直接通过 django-admin.py startproject HelloWorld 来创建项目都可以
  生成目录为:
        |-- HelloWorld 项目的容器
    |   |-- __init__.py    空文件
    |   |-- settings.py 项目配置(对于文件配置等)
    |   |-- urls.py    url声明 主要是用作mvc中的c 控制器 控制页面跳转
    |   `-- wsgi.py

    `-- manage.py    实用的命令管理工具 可以和django项目交互

     正常情况下的交互流程如下图:









扫描二维码关注公众号,回复: 916655 查看本文章












创建 APP  命令行内 python manage.py startapp myapp
    这样 在 APP 文件夹内就包含了APP所有的内容
    生成目录为:    
        |-- __init__.py #空文件
    |   |-- admin.py    #空文件
    |   |-- models.py #业务 bean 的数据配置
    |   |-- tests.py    
    |   `-- views.py  #核心业务逻辑  与 url 交互切换网页
    
    运行 django   python manage.py runserver 127.0.0.1:8000 或者 在 pycharm上直接运行

2 django 模板标签
    主要是在html上运行的使用标签
    
    if/else 标签
        基本语法格式如下:
        {% if condition %}
            ... display
        {% endif %}
        
    for 标签
        {% for athlete in athlete_list %}
            <li>{{ athlete.name }}</li>
        {% endfor %}
        </ul>
    
    ifequal/ifnotequal 标签
        {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
        {% ifequal user currentuser %} 判断 user 和 currentuser 相同
                <h1>Welcome!</h1>
        {% endifequal %}
        
    过滤器    模板过滤器可以在变量被显示前修改它,过滤器使用管道字符
        {{ name|lower }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。
        
        过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:
        {{ my_list|first|upper }}
        以上实例将第一个元素并将其转化为大写。
        
        其他过滤器:
        addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。
        date : 按指定的格式字符串参数格式化 date 或者 datetime 对象,实例:
        {{ pub_date|date:"F j, Y" }}
        length : 返回变量的长度。
    
    include 标签
        {% include %} 标签允许在模板中包含其它的模板的内容。
        如 {% include "nav.html" %}
        
    模板继承:
    {% block mainbody %}    所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。
       <p>original</p>
    {% endblock %}
    
    {% extends "base.html" %} 这里是继承的部分、
    
3 django 模型
    Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。
    
    定义模型  django 规定,如果要使用模型,必须先创建一个APP 命令为 python manage.py startapp TestApp
    创建出的模型如 上面介绍的创建APP 一样
    
    在 models 中
        class Test(models.Model):
            name = models.CharField(max_length=20)
        以上的类名代表了数据库的表名,且继承了models.Model,类里边的字段代表了数据库的字段,类型则由CharField(相当于 varchar2) DateField(相当于datetime)
        max_length 来限定长度
        
        然后 在setting.py 中,找到 INSTALLED_APPS 中 将创建的APP 名称添加进去 在命令行中 python manage.py syncdb 可以看到 Create table 字样,说明表创建成功
        表名组成结构为:app名_类名(如:TestModel_test)
        
    数据库操作:
        添加数据: uu = models.UserInfo(user='测试数据',pwd='1234') uu.save()
        
        获取数据:
            # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
            list = Test.objects.all()
            
            # filter相当于SQL中的WHERE,可设置条件过滤结果
        
            response2 = Test.objects.filter(id=1)
            
            # 获取单个对象
            response3 = Test.objects.get(id=1)
            
            #数据排序
            Test.objects.order_by("id")
    
            # 上面的方法可以连锁使用
            Test.objects.filter(name="w3cschool.cc").order_by("id")
            
        更新数据:
            # 方法1
                修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
                test1 = Test.objects.get(id=1)
                test1.name = 'w3cschool菜鸟教程'
                test1.save()
                
            # 方法2
                #Test.objects.filter(id=1).update(name='w3cschool菜鸟教程')
            
             修改所有的列
                # Test.objects.all().update(name='w3cschool菜鸟教程')
    
        删除数据:删除数据库中的对象只需调用该对象的delete()方法即可
            方法1:
                test1 = Test.objects.get(id=1)
                test1.delete()
            方法2:
                # Test.objects.filter(id=1).delete()
            
            # 删除所有数据
            # Test.objects.all().delete()
            
4 django 表单
    Request 对象:
        path:请求页面的全路径
        method:请求中的方法
            if request.method == 'GET':
        GET:获取请求参数的对象
             username = request.POST.get('username',None)
    
        COOKIES 包含所有cookies的标准Python字典对象。Keys和values都是字符串。
        FILES :包含所有上传文件的类字典对象。FILES中的每个Key都是<input type="file" name="" />标签中name属性的值
                包含下面三个Keys:
                filename: 上传文件名,用Python字符串表示
                content-type: 上传文件的Content type
                content: 上传文件的原始内容

            注意:只有在请求方法是POST,并且请求页面中<form>有enctype="multipart/form-data"属性时FILES才拥有数据。否则,FILES 是一个空字典。
        META:包含所有可用HTTP头部信息的字典。
             meta =
                 REMOTE_ADDR: 客户端IP地址
                REMOTE_HOST: 客户端主机名
                SERVER_NAME: 服务器主机名
                SERVER_PORT: 服务器端口

                META 中这些头加上前缀HTTP_最为Key, 例如:

                HTTP_ACCEPT_ENCODING
                HTTP_ACCEPT_LANGUAGE
                HTTP_HOST: 客户发送的HTTP主机头信息
                HTTP_REFERER: referring页
                HTTP_USER_AGENT: 客户端的user-agent字符串
                HTTP_X_BENDER: X-Bender头信息
        user:是一个django.contrib.auth.models.User 对象,代表当前登录的用户。
        session 唯一可读写的属性,代表当前会话的字典对象。只有激活Django中的session支持时该属性才可用
        raw_post_data 原始HTTP POST数据,未解析过。 高级处理时会有用处。
        
        Request对象也有一些有用的方法:
        方法    描述
        __getitem__(key)     返回GET/POST的键值,先取POST,后取GET。如果键不存在抛出 KeyError。
                        这是我们可以使用字典语法访问HttpRequest对象。
                例如,request["foo"]等同于先request.POST["foo"] 然后 request.GET["foo"]的操作。
        has_key()     检查request.GET or request.POST中是否包含参数指定的Key。
        get_full_path()     返回包含查询字符串的请求路径。例如, "/music/bands/the_beatles/?print=true"
        is_secure()     如果请求是安全的,返回True,就是说,发出的是HTTPS请求。

        
5 django 管理工具 admin
        Django自动管理工具是django.contrib的一部分。你可以在项目的 settings.py 中的INSTALLED_APPS看到它:
        
        激活管理工具 urls.py 中     (r'^admin/', include(admin.site.urls)),
        使用管理工具 http://yoursite:8000/admin/
        
        创建用户: python manage.py createsuperuser
        
        注册模型到 admin  就是 models 中的bean 模型  在 admin.py 中添加:admin.site.register(Test) 就可以在页面看到



pycharm创建一个简单的django的模拟登陆

1:创建django项目

    创建模拟登陆APP模型

                     命令行: python manage.py startapp LoginApp 


   

对应目录,这里可以看到,views 是核心业务逻辑实现,admin 属于管理器中的注册工具,models是数据模型,映射到数据库的表上,tests 属于测试部分

模拟登陆

在 http:127.0.0.1:8000/login 中出现登录界面 由views.firstPage 方法来实现并跳转到login.html页面

html页面为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>登录界面</h1>
    <form action="/loginOk/" method="post"> <!--- 点击登陆了后 去 urls 查找 loginOk 的业务逻辑--->
        账号:<input type="text" name="username">
        密码:<input type="password" name="passwd">
        <input type="submit" value="登录">
    </form>
</body>
</html>


页面跳转控制 :

在 urls.py 中添加代码如下

from django.conf.urls import include, url
from django.contrib import admin
from LoginApp  import views

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    #登录初始界面
    url('login',views.firstPage),
    #登录成功后跳转界面
    url('loginOk',views.login),
    #展示render 传参界面
    url('listUser',views.listUsers)
]


views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse
from LoginApp import models
import traceback

# Create your views here.

listUser=[{'username':"yang","passwd":"123"},{'username':'shu','passwd':'456'}]

def login(request):
    try:
        print("path = %s "%request.path) #测试 request  path
        print(" meta = %s "%request.META)  #测试 request meta
        username = request.POST.get('username',None)
        passwd = request.POST.get('passwd',None)
        print('用户登录的账号:%s 密码 %s '%(username,passwd))
        #uu = models.UserInfo(user='测试数据',pwd='1234')  #另一种添加到数据库的方式
        #uu.save()
        user_list = models.UserInfo.objects.all()  #获取数据库的UserInfo表的所有信息
        for user in user_list:
            if username == user.user and passwd == user.pwd:   # 如果检查出用户登录的账号在数据库存在 跳到 userExit.html 中  同时将该user作为参数传入页面
                print('检查用户账号密码....')
                return render(request,'userExit.html',{'user':user})  
                                      #页面通过django模板标签获取数据user  这里的标红 user 随意取, 和 html 中的标签内的值要一致
                                      #关键在这里  render方法  接受的第三个参数是后台返回给浏览器的数据,它是一个字典,user为自定义指针的名称

        models.UserInfo.objects.create(user=username,pwd=passwd)
        if username =="guo":                                   # 如果名称是guo 并且该用户在数据库user表信息不存在,测试传参  user_list 在页面打印出信息
            return render(request,'sucess.html',{'data':user_list})
        else:
            return render(request,'loginError.html')  #测试到登录错误的界面
    except Exception:
        traceback.print_exc("从数据库取数据出现异常") #可以查看出第几行处理异常
        return render(request,'error.html')

#初始化登录
def firstPage(request):
    return render(request,"login.html")

#测试传参
def listUsers(request):
    print('开始传值:',request)
    return render(request, "listUser.html", {"data":listUser})

login.html 登录后 通过 action跳转到 loginOk,就是 urls.py 中对应的核心逻辑 views.login 方法上,login方法通过request获取一系列数据,并且要想添加数据库的支持,

本章节仅测试 sqlite3 即 django自带轻量级数据库

接下来配置数据库信息: setting.py

首先注册 app

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'LoginApp' # App的名称  不注册的话,数据库就不知道该给哪个APP创建表
)

# Database  然后还是 setting.py 配置相关数据库参数  这里还可以配置 mysql  oracle  postgresql 等数据库信息
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

编辑 models.py

from django.db import models

"""
业务 bean
数据库配置  这里创建一个用户表  字段为 user 和 pwd  分别作为用户名和密码
"""
# Create your models here.
class UserInfo(models.Model):  # 继承 models.Model  固定写法
    user = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)

接下来通过命令来创建表

python manage.py makemigrations  

相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件

运行结果为: 在 创建出的 migrations 目录内创建出


再输入命令:python manage.py migrate

将该改动作用到数据库文件,比如产生table之类,然后 数据库中的表就创建成功了。

访问表的信息再 views 中的  login 函数有详细说明

这里仅对于userExit.html 展示下django模板标签的使用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户已存在</h1>
    账号:{{ user.user }}  <!--- 这里可以直接拿 user来用,这里的suer对应的就是views 中login 函数中标红的 user --->
    密码:{{ user.pwd }}
</body>
</html>

同时其他类型的标签有listUser.html 中的
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table border='1'>
         <thead>
            <th>用户名</th>
            <th>密码</th>
         </thead>
         <tbody>
            {% for m in data %}  <!---   for循环标签 --->
                <td>username = {{m.username}}</td>
                <td>passwd = {{m.passwd}}</td><
                </tr>
            {% endfor %}
         </tbody>
    </table>
</body>
</html>


 
 
ok 基本的模拟登陆就在这里了,其他问题下次再详谈




猜你喜欢

转载自blog.csdn.net/guoxinjie17/article/details/78339685