Django

Django

  • 安装 pip install django

新建工程


  • 命令行模式下
    django-admin startproject django1
  • pycharm中,命令同上
image.png
  • 完成后自动创建的工程文件
image.png

创建应用


进入工程目录
C:\Python_Project\Django>cd django1

创建apps
C:\Python_Project\Django\django1>python manage.py startapp app1

启动服务
C:\Python_Project\Django\django1>python manage.py runserver

创建服务器子功能

  • 打开app1下的views.py文件
from django.http import HttpResponse
def welcome(request):
    return HttpResponse('欢迎来到澡堂!')

添加路径

  • 打开django1文件夹下的urls.py文件
"""
引入包含功能的文件
"""
from app1 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    """
    添加路径和功能名,注意name必需唯一,未来可以用来替代路径名'welcome'
    """
    path('welcome/', views.welcome, name='wc')
]

在设置文件中添加自己的应用

  • 打开django1下面的setting.py文件
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    """
    添加自己的应用
    """
    'app1',
]

打开浏览器测试

  • 地址栏输入: http://127.0.0.1:8000/welcome

创建网页

  • 在app1中创建templates文件夹

单网页配置

在templates中新建login.html文件

  • 注意文件夹的名字必须是templates,django默认会自动绑定
<body>
    <form action="">
        <div>
            用户名: <input type="text" name="username">
        </div>
        <div>
            <span style="letter-spacing: 1em">密</span>码: <input type="password" name="password">
        </div>
        <input type="submit" value="登录">
    </form>
</body>

在views.py中添加功能函数

# 定义函数完成指定页面的渲染
def show_login(request):
    return render(request, 'login.html')

在urls中添加功能路径
path('login/', views.show_login, name='login')

打开浏览器测试
http://127.0.0.1:8000/login

image.png

数据传递


GET方式

在views.py文件中添加功能函数

def receive_data(request):
    user = request.GET.get('username')
    password = request.GET.get('password')
    return HttpResponse('您本次登录使用的用户名为{0},密码为{1}'.format(user, password))

在urls.py文件中添加路径
path('login/check', views.receive_data, name='login_check')

在login.html文件中给表单添加操作地址
<form action="http://127.0.0.1:8000/login/check">

POST方式

修改login.html文件中给表单添加method
<form action="http://127.0.0.1:8000/login/check" method="post">

修改views.py文件中的GET为POST

user = request.POST.get('username')
password = request.POST.get('password')

打开浏览器输入信息,点击登录

image.png
image.png

出现CSRF提示,解决方案有两种

    1. 在表单<form>下加入{% csrf_token %}

可以解决当前问题,但不推荐,存在安全隐患

    1. 在views.py中做如下修改:

引入模块from django.views.decorators.csrf import csrf_exempt
在添加函数receive_data前加装饰器

应用合并


移动路由

1.将django中的urls.py文件复制到app1中,做修改后文件如下

from django.urls import path
from app1 import views
urlpatterns = [
    path('welcome/<str:username>/<str:password>/', views.welcome, name='wc'),
    path('login/', views.show_login, name='login'),
    path('login/check', views.receive_data, name='login_check')
]

2.修改django1中的urls.py文件

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('app1/', include('app1.urls'))
]

3.修改form表单中的action
<form action="http://127.0.0.1:8000/app1/login/check" method="post">

避免归并重名

在app1下的templates下新建app1文件夹

  • 将login.HTML移动到此文件夹中

修改views.py文件中的渲染

def show_login(request):
    return render(request, 'app1/login.html')

所有需要避免重名项

1.同一工程目录下的不同应用的文件名

2.静态文件static(见本文静态文件)中的文件名

  • 不同应用下的static文件最后会归档到根目录下的static文件夹

3.模板文件templates中的文件名

  • 不同应用下的templates文件最后会归档到根目录下的templates文件夹

4.各个应用下的路由urls文件中的path()中的参数三name

  • 原则上参数一也不能重名

避免重名解决

1.工程目录结构如下:

image.png

  • 在二级文件目录static,templates下新建跟应用名相同的文件夹,之后再将文件放入其中

2.在urls.py文件中将参数一和参数三都加上应用名


image.png
  • 最好的方法是跟共同开发人员协商好,各自对应一个前缀编码,命名时加上各自的编码前缀

3.将页面访问的地址改为url的形式(前提是path()中的name不能同名)
<form action="{%url 'app1_show'%}" method="post">

页面传值


页面间传值

页面内传值

在templates中新建show.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>展示</title>
</head>
<body>
    <div class="pers">
        {% for per in persons%}
        <form action="">
            <div class="per">
                <h3>姓名: {{per.name}}</h3>
                <p>
                    性别:
                    <!--注意==左右需要加空格,否则解析不出来-->
                    {% if per.sex == '男' %}
                        <input type="radio" name="sex" value="男" checked>男
                        <input type="radio" name="sex" value="女">女
                    {% else %}
                        <input type="radio" name="sex" value="男" >男
                        <input type="radio" name="sex" value="女" checked>女
                    {% endif %}
                </p>
                <p>年龄: {{per.age}}</p>
            </div>
        </form>
        {% endfor %}
    </div>
</body>
</html>

在app1下的views.py中加入

def show(request):
    pers = [
        {'name': '冰冰', 'sex': '女', 'age': 20},
        {'name': '冰冰1', 'sex': '男', 'age': 22},
        {'name': '冰冰2', 'sex': '女', 'age': 24},
        {'name': '冰冰3', 'sex': '中', 'age': 25},
        {'name': '冰冰4', 'sex': '女', 'age': 26},
        {'name': '冰冰5', 'sex': '女', 'age': 27},
        {'name': '冰冰6', 'sex': '女', 'age': 28}
    ]
    return render(request, 'app1/show.html', {"persons": pers})

静态文件


配置文件setting.py,在文件尾部添加

  • STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  • BASE_DIR为工程目录Django/django1/...;定义可见于文件头部

在app1中新建static(工程部署时django会自动合并所有的static文件)
在html文件头部加入
{% load static %}

数据库


创建模型

在models.py文件中创建表格信息

from django.db import models
class Accounts(models.Model):
    username = models.CharField(primary_key=True, max_length=20)
    password = models.CharField(max_length=20)

admin.py

from django.contrib import admin
# 导入所有使用from .models import *
from .models import Accounts
# 该文件是管理员文件,用来完成数据库数据模型的注册保证服务器端数据库和数据模型实现数据同步
admin.site.site_header = 'App1'
admin.site.site_title = 'app1'
# 将account数据模型注册进入数据库
admin.site.register(Accounts)

数据库表格迁移

迁移初始化
python manage.py makemigrations

image.png

开始迁移:
python manage.py migrate

创建超级管理员
python manage.py creatsuperuser

输入相应信息

image.png

使用管理员信息登录

127.0.0.1:8000/admin

修改表格信息

  • 修改user的数据类型
    password = models.CharField(max_length=20)

  • 更新修改

C:\Python_Project\Django\database>python manage.py makemigrations
C:\Python_Project\Django\database>python manage.py migrate

issue

  • 1.新建应用时出现如下错误提示
File "manage.py", line 14
  )from exc
      ^
SyntaxError: invalid syntax

问题原因:python2与python3共存问题

  • 如果安装时使用的是pip3 install django
    修改python3安装路径下的python.exe为python3.exe,
    之后先修改pycharm中的settings,选中刚刚修改的文件,
    image.png

再使用python3 manage.py startapp app1即可创建应用。

  • 2.python3 manage.py runserver提示:
Traceback (most recent call last):
  File "C:\Users\LZTV\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\management\base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  • 3.数据库迁移时出现应用标签不唯一,多个admin,
    注意查看自己建立的应用是否有名字为admin的,切记不可设为admin
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容