django入门操作体验1

1.虚拟环境+django环境(若存在用之前的)  

创建一个虚拟环境 (会新建一个文件,里面有 Scripts/python.exe文件)

python -m venv myvenv
 cd myvenv        # 进入虚拟环境安装django库等
 .\Scripts\activate.bat
pip install Django  
pip install django==2.0    # 指定版本
# 下载比较慢的同学可以换个源下载
pip install django==2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

2.创建django项目和app应用程序

创建好项目,就可以用pytharm打开了

# 自己找个位置(运行时,还需要时虚拟环境哈)
python -m django startproject <projectname>    (会在当前目录下创建项目)
django-admin startproject  <projectname>

 设置好pytharm使用到的 python环境。

3.运行命令

 python manage.py  runserver    默认8000端口    ( python .\manage.py runserver)

python manage.py  runserver     0.0.0.0:8888   指定端口

或者创建应用,来看看环境成功没有

创建好项目侯,就可以用pycharm打开了
#在项目目录中
python manage.py startapp <appname>
或者:
python -m django startapp demo

这里运行时,可以能遇到问题:

1.Python 3.10中已经将collections.Iterable改为typing.Iterable,而Django 2.2和以前的版本中使用了collections.Iterator,因此无法兼容Python 3.11。

需要升级到Django 3.2以上的版本,因为Django 3.2中已经对Python 3.11进行了兼容性修复。

pip install --upgrade django

 pip uninstall django  

pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple   (下载3.2以上的)

注册应用

在公共目录setting中的INSTALLED_APPS添加 新增的<appname>  

或者写成   polls.apps.PollsConfig   (可以去复制,按住ctrl+C + shift + alt)

3.定义路由urls 和函数视图views

路径和视图函数举例

视图函数中,必须要返回HttpResponse对象,或子类的对象

如上图:

a应用内views.py中

from django.http import  HttpResponse
def index(request): #用一个参数来接收,随便写,一般写成request
    return HttpResponse("冲击40W")

b.外部urls中

导入方式有两种:
from demo应用名 import views
或者from demo.views import index  具体的
urlpatterns = [
    path("admin/", admin.site.urls),
    path('index/',views.index),   #后面不用 加括号了
]
c.启动服务器,后可以查看效果
1.python manage.py runserver 9090 # 也可以不指定端口
2.访问http://127.0.0.1:9090/index/

注意:定义了url后,默认的欢迎页,就没有了

urls传递参数 

urls.py中,views视图中。

这样就实现了,再访问路由的时候,把一些值传给了视图函数

urls.py中 
path('jobs/<int:job_id>',views.detail)


# views中,视图函数要接收这个参数。  第二个参数名要何 url中定义的一样
def detail(request,job_id):
    return HttpResponse(f"you are looking at question {job_id}")

4.统一应用的路由前缀

实现机制:

        path中,第二个参数为 include(),就会去找子路由。

若一个项目中,有多个app应用,每个app应用都有自己的url,若写在一块,会比较臃肿

a.应用内要新建一个urls文件

b.外部的urls文件中使用include引用应用内的urls文件 

应用内的urls.py也可以不导入了

效果如下

这个也可以看效果

4.前后端不分离的 

定义路由+视图+html模板__常用模板语法

a.修改视图,使用render渲染html模板

第二个参数会自动识别  templates文件中的html文件

或者这么写

 b.在应用内,新建一个文件templatesdjango会识别这个文件), 里面添加一个html文件,访问看效果:

views 中
def index(request): #用一个参数来接收,随便写,一般写成request
    # return HttpResponse("冲击40W")
    sutdents =["小王","小李"]
    return render(request,'molingli.html',{'students':sutdents})



templates文件下,molingli.html
{% if students %}
    <ul>
    {% for student in students %}
        <li><a href="">{{ student }}</a></li>
    {% endfor %}

    </ul>
{% else %}
    <p> no polls are available</p>
{% endif %}

模板引入css+js静态文件

1.在应用内放入静态资源 static, 保持如下格式就行,按格式添加一个test.css

 2.html文件中载入静态文件的目录,要点:

{% load static %} 写在顶部

   

css文件载入(head头部中)识别哪个css文件

<link href="{% static  'assets/css/test.css' %}" rel="stylesheet" />
js文件的载入(body中尾部)识别哪个js文件
<script src="{% static  'assets/js/test.js' %} "></script>

如下图

html中的标签如下


{% load static %}
<!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.0">
    <title>Document</title>

    <link href="{% static  'assets/css/test.css' %}" rel="stylesheet" />

    <style>h1 {color: blue;text-align: center;}</style>

</head>
<body>
    <a href=""  class="btn btn-info navbar-right">添加发布会</a>
    <h1>这个【蓝色】是html中通过style标签写的CSS</h1>
    <h2>这个【绿色】样式来自静态文件中的CSS文件</h2>

    {#   class为 test的 就是红色 #}
    <p  >{{ students }}</p>
    {% for s in students %}
        <p  class="red_clolor">{{ s }}</p>
    {% endfor %}

    <script src="{% static  'assets/js/custom-scripts.js' %} "></script>
</body>
</html>

test.css文件如下(.test  这些是CSS选择器,如.test表示 ,class 为test的就要符合此样式)

.red_clolor{
    background-color: red;
}


 h2 {
        color: green;
    text-align: center;
     }

模板的继承

 子模板中写法

使用{% extends "molingli.html" %} 继承  molingli,html 页面

5.数据库概念ORM操作

数据库迁移命令

一个类就是一个表,一个对象就是一条数据

创建好类后,用如下命令,把表同步到数据库。

# 生成迁移文件(此时还没操作数据库)如果确定是哪个应用的,就可以加应用名

python manage.py makemigrations  [应用名称]  # 如果命令不行后面加个应用名


# 同步数据库  (操作了数据库)
python manage.py migrate   

setting中配置数据库如mysql

数据库配置在setting中,如下

代码:

新增一个mysql数据库

如果配置不写 test部门, 新建数据库默认要 utf8mb4  和 utf8_general_ci

  • DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'polls',            # 数据库名
            'USER': 'root',            # 用户名
            'PASSWORD': 'qwe369',        # 密码
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'TEST':{
                'CHARSET': 'utf8',
                'COLLATION': 'utf8_general_ci', }
                    }
    }
    

修改后,需要安装第三方库 pip install  pymysql,(django 3 不要用pymysql了?)

新版本的要装库:  pip install mysqlclient

并且需要修改连接数据库的连接需要的库, 在  mysite(应用)   \ 的  __init__.py中

import pymysql

pymysql.install_as_MySQLdb()

关系表举例

 1.例子:老师表和班级表(一个老师只能在一个班级)(多余1关系)

这个时候setting中注册了应用就起作用了

from django.db import models

# Create your models here.

class Grade(models.Model):
    num= models.CharField(max_length=64,unique=True)

    def __str__(self):
        return self.num

class Teacher(models.Model):
    name= models.CharField(max_length=64)
    grade = models.ForeignKey(Grade,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

使用菜单中tool中的东西  ctrl alt R  使用 python manage控制台

可以快速的使用命令

 创建好后,这里就有表了

 注意: 第一次 migrate时,不要加 应用名,需要吧基础的东西放过去

如:基础放过去了,才能 createuser

模型表注册到admin

admin.py中注册表,启动服务,就能在admin中查看数据库了

配置setting文件(admin语言等)

补充:默认看到的页面是英文的,可以配置,配置后变成中文

修改setting文件

方式1 

LANGUAGE_CODE = "zh-hans"   # 默认 "en-us"
# LANGUAGE_CODE = "en-us"
TIME_ZONE = "Asia/Shanghai"           # 默认 UTC
USE_TZ=False 是否使用UTC时间,不使用就是用本地时间

方式2:

应该在配置文件 settings.py 中 MIDDLEWARE 最后加入如下配置

加一排  'django.middleware.locale.LocaleMiddleware', # admin界面语言本地化

创建用户命令

创建管理员:(创建后才能进入admin页面)

  • python manage.py createsuperuser

taoke 

taoke@qq.com

123456

在admin页面中新增班级和老师

 在添加老师时,就能发现一个老师只能选一个班级

多对多关系表举例 

例子二:班级和学生(假设学生可以参加多个班级)多对多关系

则使用外键ManyToManyField

定义在逻辑发起方:学生参与班级,即学生表

同样,在admin注册

班级,老师,学生model类如下

class Grade(models.Model):
    #班级如:1班、2班
    num=models.CharField(max_length=64,unique=True)

    def __str__(self):
        return self.num

class Teacher(models.Model):
    #姓名
    name=models.CharField(max_length=64)
    #老师所在班级
    grade=models.ForeignKey(Grade,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class Student(models.Model):
    #姓名
    name=models.CharField(max_length=64)
    #班级
    grades=models.ManyToManyField(Grade,through='Student_grade_rel')    #through写关系表的类名

#关系表,学生和它是多对1,班级和它也是多对1
class Student_grade_rel(models.Model):
    #学生
    sutent = models.ForeignKey(Student, on_delete=models.CASCADE)
    grade = models.ForeignKey(Grade, on_delete=models.CASCADE)
    # 新增字段---某学生在该班的排名
    rank = models.IntegerField()

    #命名关系表
    class Meta:
        db_table = 'sign_guest_events'

 新增学生,可以看到学生表中,只有一个字段,另一个多对对关系的字段,是通过关系表关联的

 配置关联表

补充:orm简单的操作和  url参数的传递

模型的继承

补充: 在项目中,可以创建 一个 叫common的应用,在里面存放一些公共的表的定义。

详见:OMR创建表_omr python_A~taoker的博客-CSDN博客

八、响应的整理:

        第一种:HttpResponse

 返回字符串的 from django.http import HttpResponse

可以把字典转化成json字符串,就可以用HttpResponse 返回了

其他参数:

  • content_type 响应体格式
  • status: 响应状态码  200的, 400 , 555(不存在的浏览器会显示不认识)

        第二种:JsonResponse

from django.http import  HttpResponse,JsonResponse return JsonResponse(project_data,json_dumps_params={'ensure_ascii':False}) 

它是基础 HttpRespose的

        #json_dumps_params 有中文,可以加这个参数

 如果,不是字典,如果时字典套字典,就加一个safe=False , 

   参数1:第一个需要是字典,或者是列表,如果是querySet列表对象,就需要用list转化一下

   参数2: safe =False                        如果是字典套字典,就加这个参数

   参数3: json_dumps_params=False       有中文,可以加这个参数

    第三种: render

from django.shortcuts import render

注:views中的  {students: students}   

        和html中的 students,写法要一样,  但实际的内容是  后面的值。

第四种:Response (restFramework 的)

功能比Jsonresponse强大,还能根据不同的配置进行响应渲染,详见

一、视图类、视图集_A~taoker的博客-CSDN博客

九:使用技巧

1.  命令使用帮助

python .\manage.py help 命令的帮助

python .\manage.py startapp -h 创建应用-h 查看具体的帮助

2.使用python manage.py 命令控制台:

可以不用输入 pythonmanage.py  ,还能智能提示

专业版本pytcharm tools,还可以使用快捷键

3.快速启动

4. pycharm 工具使用

        ctrl+D,快速复制一行

        复制路径: ctrl + c +shift + alt

知识点小结:

1.views.py视图函数中需要带一个参数,习惯把它些成了request

2.HttpResponse是django.http的一个东西,可以直接返回内容到浏览器上

3.render 可用来渲染html模板,并且可以给模板传值

4.html文件中的模板语法

  •         使用变量  {{ }}
  •         for循环   {% for i in list %}  -----{% endfor%}
  •         if判断     {% if 条件 %}---------{% endif %}
  •         列表元素个数:   **list | lenth
  •         载入静态文件 {% load static %}
  •         css文件载入(head头部中)
        <link href="{% static  'assets/css/custom-styles.css' %}" rel="stylesheet" />
  • js文件的载入(body中)
        <script src="{% static  'assets/js/custom-scripts.js' %} "></script>
  • 父模板和子模板的插槽写法:{% block ****  %}  ---插槽---{ % endblock %} 
  • 模板继承写法:{% extends "base.html" %}

5.多对1,多对对表关系的定义。

6.url中参数传递,orm操作,获取一个数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值