Django系列之第一个项目搭建

一、安装

  (1)使用pip3 install django在控制台安装django;

  (2)添加到环境变量

  

二、创建项目

  方式1:通过命令创建

 (1)创建project: 通过django-admin.py startproject mysite: mysite为自己的项目名称

C:\Users\XS\PycharmProjects>django-admin.py startproject MyFirstDjango
C:\Users\XS\PycharmProjects\MyFirstDjango 的目录

2018/11/05  16:53    <DIR>          .
2018/11/05  16:53    <DIR>          ..
2018/11/05  16:53               560 manage.py
2018/11/05  16:53    <DIR>          MyFirstDjango
               1 个文件            560 字节
               3 个目录  8,265,093,120 可用字节

 (2)创建app: python manage.py startapp myApp : myApp为app名称。注意:路径要定位到MyFirstDjango下面再执行,不然找不到manage.py文件。

C:\Users\XS\PycharmProjects\MyFirstDjango>python manage.py startapp mysite

C:\Users\XS\PycharmProjects\MyFirstDjango 的目录
2018/11/05  17:01    <DIR>          .
2018/11/05  17:01    <DIR>          ..
2018/11/05  16:53               560 manage.py
2018/11/05  17:01    <DIR>          MyFirstDjango
2018/11/05  17:01    <DIR>          mysite
               1 个文件            560 字节
               4 个目录  8,264,384,512 可用字节

发现在MyFirstDjango文件下面多了一个mysite的app文件夹。

  方式2:通过pycharm开发工具创建

  File->New Project->Django

创建好了目录结构如下:

三、编写流程

我们从浏览器发请求过来到服务端处理这个流程来梳理一下:

(1)请求url: 找到urls文件,这里的文件路径由我们自己定义,wsgi路由系统内部封装了这里配置的url进行循环迭代,然后执行url对应的view下的action。

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

(2)运行项目: python manage.py runserver 8080,在浏览器中输入http://127.0.0.1:8080/admin/查看结果,这里的admin后面会详细讲。

(3)创建数据表:打开app下的models,所有的数据表对应的class都继承了models.Model

from django.db import models

# Create your models here.
class UserInfo(models.Model):

    username=models.CharField(max_length=20)
    password=models.CharField(max_length=20)
    email=models.CharField(max_length=30)

Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.

执行python manage.py makemigrations启动迁移,python manage.py migrate执行本次迁移。执行了这两命令后我们可以发现在app文件夹下的migrations下多了迁移版本文件。

# Generated by Django 2.1.3 on 2018-11-05 02:18

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='UserInfo',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('username', models.CharField(max_length=20)),
                ('password', models.CharField(max_length=20)),
                ('email', models.CharField(max_length=30)),
            ],
        ),
    ]

在后期开发中可能需要增加表格字段,我们可以直接在models对应得类中添加字段,如下

from django.db import models

# Create your models here.
class UserInfo(models.Model):

    username=models.CharField(max_length=20)
    password=models.CharField(max_length=20)
    email=models.CharField(max_length=30)
    phone=models.CharField(max_length=20)#增加字段

仅仅这步操作是不会成功得,还需再次执行python manage.py makemigrations和python manage.py migrate才能迁移成功。每迁移一次在migrations文件夹下都会多一个迁移文件

# Generated by Django 2.1.3 on 2018-11-05 06:29

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('mysite', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='userinfo',
            name='phone',
            field=models.CharField(default=1, max_length=20),
            preserve_default=False,
        ),
    ]

(4)做一个简单增加,查询功能

   1、利用已经创建好的数据表UserInfo;

   2、在全局配置文件夹(MyFirstDjango文件夹下面得settings,urls和wsgi都是全局得配置文件)的urls文件配置路由,如下:这里可以使用path和url两个配置路由,但是path不能使用正则匹配。

"""djtest3 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
from mysite import views

#注意:使用path的时候不能使用正则

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'userinfo/',views.userinfo),
]

  3、编写路由对应的函数:在mysite下的views下创建如下:这里包含两个重要的类HttpRequest和HttpResponse,分别是用来封装请求信息和响应信息的,在django架构下,HttpRequest已经封装好了,我们只需要使用对象即可,下面的userinfo方法中的request就是

HttpRequest类的一个对象。

from django.shortcuts import render,HttpResponse
from mysite import models

# Create your views here.

def userinfo(request):
    if request.method=="POST":
        username=request.POST.get("username")
        password=request.POST.get("password")
        email=request.POST.get("email")
        models.UserInfo.objects.create(username=username,password=password,email=email)
    user_list=models.UserInfo.objects.all()
    return render(request,"index.html",{"user_list":user_list})

HttpRequest的属性和方法:

# path:       请求页面的全路径,不包括域名
#
# method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如
#
#                    if  req.method=="GET":
#
#                              do_something()
#
#                    elseif req.method=="POST":
#
#                              do_something_else()
#
# GET:         包含所有HTTP GET参数的类字典对象
#
# POST:       包含所有HTTP POST参数的类字典对象
#
#              服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
#              HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
#              if req.POST来判断是否使用了HTTP POST 方法;应该使用  if req.method=="POST"
#
#
#
# COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。
#
# FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中                     name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
#
#             filename:      上传文件名,用字符串表示
#             content_type:   上传文件的Content Type
#             content:       上传文件的原始内容
#
#
# user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
#              没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
#              可以通过user的is_authenticated()方法来辨别用户是否登陆:
#              if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
#              时该属性才可用
#
# session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。

在django架构下面,响应内容是需要我们自己编写的,HttpResponse下主要有三种响应的形式:

  1)直接使用HttpResponse返回字符串或者html字符串,这种形式不包含python模板渲染;

  2)render: render(request, template_name, context=None, content_type=None, status=None, using=None),可以向模板发送数据,渲染成浏览器能够解析的html文件;

  3)redirect:跳转到视图方法。

render与redirect的区别:render只是返回模板的html内容,不会重定向,不会改变刷新后的url;redirect会走路由然后执行路由对应方法,最终的url和路由的url对应。

  4、模板文件index.html:在全局模板templates下面新建index.html。{% %}和{{ }}是python模板的语法,用来渲染后台传过来的数据。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/userinfo/" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="text" name="password">
        邮箱:<input type="text" name="email">
        <input type="submit" value="提交">
    </form>
    <hr>
    <h1 id="usr">用户信息</h1>
    <table border="1">
        <thead>
            <tr>
                <td>用户名</td>
                <td>密码</td>
                <td>邮箱</td>
            </tr>
        </thead>
        <tbody>
            {% for item in user_list %}
                <tr>
                    <td>{{ item.username }}</td>
                    <td>{{ item.password }}</td>
                    <td>{{ item.email }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
    <script src="/static/jQuery/jquery-1.10.2.min.js"></script>
    <script>
        $('#usr').css('color','red')
    </script>
</body>
</html>

  5、运行项目:在终端中输入 python manage.py runserver 8089,然后再浏览器中访问http://127.0.0.1:8089/mysite/userinfo/,可以看到页面,第一个django项目运行起来了。

参考文档: https://www.cnblogs.com/yuanchenqi/articles/6083427.html

猜你喜欢

转载自www.cnblogs.com/UncleDrew/p/9914496.html