django的下载安装:

  安装方式一:

pip install django==1.11.9
#后面的1.11.9为版本号
#如果pip用的时候显示:Fatal error in launcher: Unable to create process using '"'可以试试:
python -m pip install django==1.11.9

  安装方式二:


    除了上面的pip安装,还可以从django官网下载源码安装
    下载完之后会有如:django-1.11.8.tar.gz直接用解压软件解压然后进入cmd命令窗口,如果你是解压在D盘根目录的话(也就是说直接在D盘,而不是在D盘的文件夹内路径为D:\djanjo-1.11.8\)

在cmd命令窗口输入:
cd D:
cd django-1.11.8
python setup.py install

     安装方式三:(阔以说这是个傻瓜式安装最简单了)

     进入pycharm 点击File---->Setting----->Project:mysite----->project Interpreter之后进入选择Python解释器窗口:

    以上为三种安装django的方式,只需要一种方式将django正确安装就行了,没必要全都走一遍。

 django安装完毕: 

  创建Django项目:

创建一份名为“mysite”的django项目:
在cmd命令窗口中输入:
django-admin startproject mysite

   创建完给运行一下试试了:

运行命令为:
python manage.py runserver  127.0.0.1:8000
后面的ip和端口可以不加默认就是127.0.0.1:8000

  如果安装完运行时报错: UnicodeEncodeError...
    报这个错误通常是因为计算机名为中文,改成英文的计算机名重启应该就可以了。

  检查模板文件的配置:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "template")],  # template文件夹位置
        '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',
            ],
        },
    },
]

如果是老版本的django话会将  'DIRS': [os.path.join(BASE_DIR, "template")]  放到外面,如果实在TEMPLATES外面就移进去
正确的模板文件配置

   静态文件的配置:

STATIC_URL = '/static/'  # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),  # 静态文件存放位置
]
这就是静态文件的配置

   因为刚开始还没有接触中间件所以先将csrf中间件的那行代码注释掉:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
注释csrf中间件

django基础必备的三样东西:


  全部的django全都要导入:

from django.shortcuts import HttpResponse, render, redirect
也就是说全靠HttpResponse,render,redirect三件宝

  HttpResponse:内部传入字符串参数,返回给浏览器。

def index(request):
    # 业务逻辑代码
    return HttpResponse("OK")  

  render:除了request参数外还接收一个带渲染的模板文件和一个保存数据的字典参数,将数据填充进模板文件,最后把结果返回给浏览器

def index(request):
     #业务逻辑
      return render(request,"index.html",{"name":"kxl","hobby":"play"})

    redirect:接收一个参数,表示跳转到指定的URL。

def index(request):
     #业务逻辑
     rerurn redirect("/home/")

django的入门:

  什么是MTV:   

   MTV模式就是:Model(模型),Template(模板)和View(视图),这就是MTV框架了

  MVC模式:

    MVC全名:Model View Controller,MVC将软件系统分为三个基本部分:模型、视图、控制器。

django的MTV模式:


  Model(模型):负责业务对象与数据库的对象(ORM)
  Template(模板):负责如何把页面展示给用户
  View(视图):负责业务逻辑,并在适当的时候调用Model和Template
  此外,django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

Django的app:


  一个django项目可以有很多个App,用来隔离不同功能模块的代码 
  用命令创建app:

python manage.py startapp app01

  在pycharm中创建app:
    Tools------>Run manage.py Task...然后输入startapp app01就可以创建了
    所有python manage.py开头的命令在这儿都能用

django的路由系统:
·  url配置(URLconf)就像Django所支撑网站的目录。它的本质是URL与要该URL调用的视图函数之间的映射关系。

  URLconf的配置: 

这是基本格式:
from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图函数,参数,别名),
]

django 2.0中的路由系统已经变为:
from django.urls import path
urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]  

  url中参数是什么意思呢?
    1.正则表达式:一个正则表达式字符串
    2.views视图函数:一个可以调用的对象,通常为一个视图函数或是指定视图函数路径的字符串
    3.参数:可选的要传递给视图函数的默认参数(字典形式)
    4.别名:一个可选的name参数

正则表达式的配置与注意事项:

基本的配置,与书写方式:
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

注意事项:
    1.urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功就不再继续。
    2.若要从url中捕获一个值,只需要在它周围放置一堆圆括号(分组匹配)。
    3.不需要添加一个前导的反斜杠,因为每个url都有。例如,应该是^articles而不是^/articles
   4.每个正则表达式前面的‘r’是可选的但是建议加上

  补充:有时候写url时总会丢掉后面的/,这样的url到底能不能访问呢?说错吧好像也没错啊,那它能不能访问网页就要看你怎么设置了

# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
APPEND_SLASH=True

分组命名匹配:

  怎样的匹配叫做分组命名匹配呢,看字面意思是有了分组,给分组起了名字,但是怎样操作的呢:在python的正则表达式中,分组命名正则表达式的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式,将上面基本写法用分组命名匹配怎么写呢:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

这个实现的效果和上面是一样的,但是区别就在于:分组命名匹配捕获的值是作为参数的话是关键字参数,而不是位置参数例如:
/articles/2017/12用分组命名匹配的话在调用视图函数时:
views.month_archive(request, year="2017", month="12")

  url捕获的参数:

    url捕获的参数永远都是字符串,每个URLconf中捕获的参数都作为普通的python字符串传给视图函数,无论正则表达式使用什么匹配方式例如:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
传到视图函数view.year_archive()中的year参数永远是一个字符串类型

  include其他的URLconf:(URLconf可以包含其他的URLconfs文件):   

from django.conf.urls import include, url
urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^blog/', include('blog.urls')),  # 可以包含其他的URLconfs文件
]

也就是说如果django项目中有很多app时如果url都写在同一个URLconf文件中的话是不是有可能会有点乱啊,所以就可以在妈诶个app下都创建一个Urlconf文件urls,
将app自己相关的url写在自己的URLconf中然后将app的Urlconf文件include到整个项目的URLconf文件中

命名URL和URL反向解析:

  简单的说url反向解析就是给URL加上name,这样的话在调用url时没必要写死url,以前调用url时都是写死了url导致如果修改了原来的url,在调用的地方都要修改而用url方式向解析却解决了这个问题,调用url只需要url的name,就算url改了name不该就能用

url(r'^home', views.home, name='home'),  # 给我的url匹配模式起名为 home
url(r'^index/(\d*)', views.index, name='index'),  # 给我的url匹配模式起名为index

  如果url写成这样在模板中怎么用呢:

{% url 'home' %}#这样就能访问到home了,这儿的home是url的name并不是url

  那么views中的用法是什么样呢:

from django.urls import reverse#首先得导入reverse模块

reverse("index", args=("2018", ))  #这是reverse的使用方式

  具体用法示例:(无参数版)

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

urlpatterns = [

    url(r'^admin/', admin.site.urls),
    
    url(r'^login/',views.login, name="login" ),  # 给我的url匹配模式起名为login
    url(r'^index/',views.index, name="index" ),  # 给我的url匹配模式起名为index
]
urls.py
from django.shortcuts import render,HttpResponse,redirect
from django.urls import reverse


def login(request):
    if request.method=="POST":#判断是否是post请求
        print(request.POST)
        return redirect(reverse("index"))#反向解析/index/用它的name属性
    else:
        return render(request,"login.html")


def index(request):
    return render(request,"index.html")
views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
<form action="{% url "login" %}" method="post">
    <p>user<input type="text" name="name"></p>
    <p>password<input type="password" name="pwd"></p>
    <p><input type="submit" value="提交"></p>
</form>

</body>
</html>
简单的登录html页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
<h1>这是index页面</h1>
</body>
</html>
为了举例写的简洁版index页面

  反向解析算是差不多解决了,但是我们应用时肯定得穿参数啊,不可能是这样简单的没有参数啊!

  在前端反向解析时传参方法:直接跟在name后面空格分隔:如:{% url 'news-year-archive' 2012 %}
  后端反向解析时传参方法:reverse中参数写在args中:如:reverse('news-year-archive', args=(year,))

命名空间模式:
  project中的urls.py

from django.conf.urls import url, include
 
urlpatterns = [
    url(r'^a/', include('app01.urls', namespace='author-polls')),
    url(r'^b/', include('app01.urls', namespace='publisher-polls')),
]
project中的urls.py
from django.conf.urls import url
from app01 import views
 
app_name = 'app01'
urlpatterns = [
    url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]
app中的urls.py

  模板中引用:{% url 'app01:detail' pk=12 pp=99 %}
  views中的函数引用:v = reverse('app01:detail', kwargs={'pk':11})

posted on 2018-01-16 22:58  无痕5201314  阅读(326)  评论(0编辑  收藏  举报