返回顶部

zhangfd

个人博客,仅供学习使用

导航

django入门

django venv

  • 安装python
  • 安装vscode
  • 创建虚拟环境;python -m venv .venv_hero
  • 创建并进入目录:mkdir pro_test1
  • 激活选择虚拟环境:activate
  • 创建项目:pip install django==2.0,django-admin startproject test1
  • 创建app:cd test1,django-admin startapp booktest
  • 设置settings.py:加入booktest

django models

  • 定义模型类:booktest/models.py
from django.db import models

# Create your models here.
class BookInfo(models.Model):
    title=models.CharField(max_length=20)
    pub_date=models.DateField()
    ## 返回信息能够查看
    def __str__(self):
        return self.title
        # return self.title.encode('utf-8')

class HeroInfo(models.Model):
    name=models.CharField(max_length=20)
    content=models.CharField(max_length=100)
    gender=models.BooleanField(default=True)
    book=models.ForeignKey(BookInfo,on_delete=models.DO_NOTHING)

    # def __str__(self):
    #     return self.name
  • 生产迁移文件(名词:相当于sql语句文件):python manage.py makemigrations

  • 执行迁移文件(创建数据库,生成表的操作):python manage.py migrate --- 会生成db.sqlite3数据库

  • 使用shell操作:python manage.py shell

## 查询
python manage.py shell
from booktest.models import BookInfo
BookInfo.objects.all()
## 插入
b=BookInfo()
b.title='射雕英雄传'
from datetime import date
b.pub_date=date(2020,7,12)
b.save()
BookInfo.objects.all()

b=BookInfo()
b.title='神雕侠侣'
from datetime import date
b.pub_date=date(2020,7,12)
b.save()
BookInfo.objects.all()
## 修改
b=BookInfo.objects.get(id=1)
b.title='神雕侠侣'
b.save()
BookInfo.objects.all()

from booktest.models import HeroInfo
h=HeroInfo()
h.name='郭靖'
h.gender=True
h.content='降龙十八掌'
h.book=BookInfo.objects.get(id=1)		## 外键关系
h.save()
HeroInfo.objects.all()

django admin

  • 创建超级用户:python manage.py createsuperuser
python manage.py createsuperuser
Username (leave blank to use 'zhangfd'): admin
Email address: admin@163.com
Password:admin123456
Password (again):admin123456
Superuser created successfully.
  • 进入后台:python manage.py runserver
LANGUAGE_CODE = 'zh_Hans'     		## zh_Hans --中文
TIME_ZONE = 'Asia/Shanghai'       	## Asia/Shanghai
  • 注册模型类:admin.py
from django.contrib import admin
from .models import *

# Register your models here.
## 定义后台显示信息
class BookInfoAdmin(admin.ModelAdmin):
    list_display=['id','title','pub_data']
class HeroInfoAdmin(admin.ModelAdmin):
    list_display=['id','name','content','gender','book']

## 对模型类进行注册后才能在后台查看到信息
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)

django views + urls

  • views.py即函数
from django.shortcuts import render
from django.http import HttpResponse	## 此处只用做功能介绍,实际中用render返回

# Create your views here.
## HTTPRequest
def index(request):
    ## HttpResponse
    return HttpResponse("hello world")	## 此处只用做功能介绍,实际中用render返回
  • 设置urls
## 分析
#- def main():
#    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test1.settings')
#- test1.settings:
#    ROOT_URLCONF = 'test1.urls'
#- test1.urls:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('booktest.urls')),
]
#- booktest.urls
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
    path('index/', views.index,name="index"),
]

django templates

  • 创建目录:project_name/templates/app_name1/
  • 模板文件:test1/templates/booktest/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>hello world!</h1>
    <hr>
    {% for i in list %}
        <h3>{{i}}</h3>
    {% endfor %}
</body>
</html>
  • 编写返回页面视图:views.py
from django.shortcuts import render
# from django.http import HttpResponse
# Create your views here.
## HTTPRequest
def index(request):
    context={'title':'django首页','list':range(10)}     ## 多个字段需要传入html时,可以考虑字典
    # return HttpResponse("hello world")
    return render(request,'booktest/index.html',context)	## context为传入HTML的参数
  • 设置模板路径:settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')], ## templates模板路径拼接
        ...
}
  • django 支持的模板语言
<title>{{ title }}</title>  ## 变量
{% for i in list %}		## 循环
   <h3>{{i}}</h3>
{% endfor %}

django models + views + templates

  • views.py
#coding=utf-8
from django.shortcuts import render
from .models import *
# from django.http import HttpResponse

# Create your views here.

## HTTPRequest
def index(request):
    #context={'title':'django首页','list':range(10)}     ## 多个字段需要传入html时,可以考虑字典
    # return HttpResponse("hello world")
    list = BookInfo.objects.all()
    context = {'booklist':list}
    return render(request,'booktest/index2.html',context)

def detail(request,id):                 ##  id 用来接收url.py中匹配到的数字
    print(id)
    list = BookInfo.objects.get(id=id).HeroInfo_set()    ## 使用网页传过来的值,找到BookInfo中对应的一本书
    ## 反向获取引用bookInfo的所有HeroInfo信息
    ## HeroInfo中的book字段设置为外键,是BookInfo中title
    context = {'herolist':list}
    return render(request,'booktest/detail.html',context)
  • index2.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=, initial-scale=1.0">
    <title>图书列表</title>
</head>
<body>
    <ul>
    {% for book in booklist %}
        <li><a href="/{{ book.id }}">{{ book.title }}</a></li>
    {% endfor %}
    </ul>
</body>
</html>
  • detail.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>英雄信息</title>
</head>
<body>
    <a href="/">首页</a>
    <hr>
    <ul>
    {% for hero in herolist %}
        <li>{{hero.name}}</li>
    {%endfor%}
</ul>
</body>
</html>
  • urls.py
from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('index/', views.index),
    ## 网页访问:http://127.0.0.1:8000/1,http://127.0.0.1:8000/2 ..
    path('(\d+)',views.detail),   ## ()提取数字:\d+   从url页面获取的数字,在views中使用变量如id接收
]

posted on 2020-07-12 22:02  zhangfd  阅读(137)  评论(0编辑  收藏  举报