Django快速学习(一)总览

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30162859/article/details/82156199

1. 入门

1.1 虚拟环境

pip install virtualenv
pip instal virtualenvwrapper-win

可以自己设置一个 WORKON_HOME的环境变量, 这样虚拟环境就全部都会安装在该目录中。

# 常用命令
mkvirtualenv 环境名   #创建
mkvirtualenv [mkvirtualenv-options] [virtualenv-options] <name>

lsvirtualenv        # 列出所有已安装虚拟环境
rmvirtualenv 环境名    # 删除
workon 环境名      # 激活环境
deactivate          # 退出激活

1.2 查看版本

import django
django.get_version()

1.3 创建项目

django-admin startproject 项目名

项目名中的目录

--demo1
-----demo1               # 这是一个模块,如果想加新的功能,就新增加一个模块就好
--------__init__.py     # 空文件,表示模块
--------settings.py     # 项目的配置
--------urls.py         # 项目的URL声明
--------wsgi.py         # 项目与WSGI兼容的web服务器入口,部署时候用
-----manage.py      # 命令行工具,通过它可以使用多种方式对项目交互

settings.py中已经配置好了默认使用sqlite3数据库

1.4 创建应用app

创建一个app,在其中设计模型,以完成和数据库的交互。

python manage.py startapp booktest

app的目录结构

--booktest
----migrations          # 数据库迁移文件保存的文件夹
------__init__.py
----__init__.py
----admin.py            # 
----app.py              #
----models.py           # 定义模型类
----tests.py            # 自带测试模块
----views.py            # 视图定义文件

模板文件夹还没有创建

1.5 注册app

把引用注册到 installed_apps中:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booktest.apps.BooktestConfig'
]

1.6 设计models

在booktest/models.py中设计python类:

from django.db import models

# 自己定义类
class BookInfo(models.Model):
    """不需要创建id,会自动维护"""
    btitle = models.CharField(max_length = 20)    # 必须是models中提供的数据类型
    bpub_date = models.DateTimeField()
    def __str__(self):                    # 没有修改models的数据库结果,可以不用迁移
        return f'书名为:{self.btitle}'

class HeroInfo(models.Model):
    hname = models.CharField(max_length = 10)
    hgender = models.BooleanField()
    hcontent = models.CharField(max_length = 1000)
    hbook = models.ForeignKey(BookInfo, on_delete= models.CASCADE)   # 引用对象,数据库中会自动使用外键, 从django 2.0开始,要指定 on_delete

1.7 迁移

  1. 根据所定义的model生成迁移文件
python manage.py makemigrations
  1. 根据迁移文件执行生成数据库
python mange.py migrate

1.8 使用命令行测试

python mange.py shell
from booktest.models import *
>>> from booktest.models import BookInfo
>>> b = BookInfo()
>>> b.btitle = 'hhs'
>>> from datetime import *
>>> b.bpub_date = datetime(year = 1999,month = 12, day = 10)
>>> b.save()
>>> BookInfo.objects .all()   # 返回了结果
<QuerySet [<BookInfo: 书名为:hhs>]>

b.delete()  # 删除
b = BookInfo.objects.get(pk = 1)     # 根据主键查找
b = BookInfo.objects.get(btitle = 'hhs' )     
b.btitle = sdsd
b.save() # 修改

1.9 管理

创建管理员

python manage.py createsuperuser

运行项目

python manage.py runserver 8080

进入管理界面

访问本地端口/admin

更改文字显示中文

在settings.py中修改:

LANGUAGE_CODE = 'zh-hans' #'en-us'
TIME_ZONE = 'Asia/Shanghai'

注册模型到管理页面

booktest/admin.py:

from django.contrib import admin
from .models import *
# Register your models here.

admin.site.register(BookInfo)

刷新管理页面,可以对这个类的数据进行CRUD

自定义管理页面

django提供了admin.ModelAdmin类,通过定义其子类,来定义模型在Admin界面中的显示方式:

class BookInfoAdmin(admin.ModelAdmin):
    list_display = ['id','btitle','bpub_date']
    list_per_page = 5
    list_filter = ['btitle']
    search_fields = ['btitle']
    # 添加/修改页面的属性分组
    fieldsets = [
        (组名1, {'fields':[字段名]}),
        (组名2, {'fields':[字段名]}),
    ]

admin.site.register(BookInfo, BookInfoAdmin)

关联对象同时注册

class HeroInfoInline(admin.StackedInline):   # 除了StackedInline还有其他显示方式
    model = HeroInfo
    extra = 2
class BookInfoAdmin(admin.ModelAdmin):
    inlines = [HeroInfoInline]

admin.site.register(BookInfo, BookInfoAdmin)

1.10 视图

booktest的app中的views.py,里面写函数用于处理请求返回响应

def index():
    return HttpResponse("hello world")

settings.py中已经指定了url的根配置文件:

ROOT_URLCONF = 'test1.urls'

需要在项目模块的 urls.py中加入 app的url:

from django.contrib import admin
from django.urls import path,include
from booktest.views import index

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

app中创建urls.py文件,在其中写路由规则:

from django.urls import path
from .views import *

urlpatterns = [
    path('', index )
]

1.11 使用模板

模板位置

和manage.py同级,创建templates文件夹,在其中创建 和app同名文件夹,里面写模板

配置模板路径
在settings.py 中的 TEMPLATES中的DIRS里面配置模板路径

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates') ],                # 编写路径位置

硬编码写模板

from django.http import  HttpResponse
from django.template import RequestContext, loader
# Create your views here.


def index(*args):
    temp = loader.get_template('booktest/index.html')    # 读取模板
    return HttpResponse(temp.render())                   # 返回视图结果

简化写法

from django.shortcuts import render
# Create your views here.


def index(request):
    return render(request, 'booktest/index.html')

1.12 模板传递数据

在render方法中,传递第三个参数,类型为dict:

from models import *
def index(request):
    allbooks = BookInfo.objects.all()               # 从model中获取数据
    context = {'title':'hello','list':allbooks}     # 创建传值字典
    return render( request, 'booktest/index.html', context)

模板中挖坑:



{{ title}}

{%for book in list %}
    <li>{{book}}</li>
{%endfor%}

1.13 从请求中获取参数

添加超链接:

{% for b in books %}
        <li><a href="show/{{ b.id }}">{{ b }}</a></li>
{% endfor %}

创建新的view:

def show(request,id):
    book_detail = BookInfo.objects.get(pk = id)
    context = {'book': book_detail, 'heros': book_detail.heroinfo_set.all() ,'count': book_detail.heroinfo_set.count()}
    return render(request, 'booktest/show.html',context)

创建对应的template:

<table>
    <tr>
        <td>{{ book.id }}</td>
        <td>{{ book.btitle }}</td>
        <td>{{ book.bpub_date }}</td>
        {% for h in  heros %}
            <td>{{ h.hname }}</td>
        {%  endfor %}

    </tr>
</table>

创建对应的url:

path('show/', include('booktest.urls'))

path('<id>', show)                     # 获取参数

猜你喜欢

转载自blog.csdn.net/qq_30162859/article/details/82156199
今日推荐