Django学习笔记

随便学学。。渐渐的发现简书没有lark在线文档好用了。。以后不一定会搬笔记过来了。。大概可能。

  1. 安装
git clone https://github.com/django/django.git
cd django/
sudo python setup.py install
  1. 创建第一个django项目
django-admin startproject HelloWorld
python3 manage.py runserver 0.0.0.0:8000

踩坑:
第一次在浏览器输入0.0.0.0:8080发现显示这样的页面:


图片.png

解决方案:打开这个项目文件夹-settings.py,改其中的ALLOWED_HOSTS = []为ALLOWED_HOSTS = ['*'],成功便会显示如下:

图片.png
  1. django项目的目录

settings.py 项目配置
urls.py 项目的URL声明
urls.py 项目的URL声明
manage.py:启动django的主要文件

在写settings.py里的DIRS时,出现了报错:
unsupported operand type(s) for +: 'PosixPath' and 'str' 应该先把BASE_DIR的PosixPath转换成str类型

  1. 开始写一个小demo
    理解深入一下:
    假设我们的view.py是这样的:
from django.shortcuts import render
def hello(request):
    content = [{"username":"yumi","password":"hahahah"},{"username":"arashi","password":"5*20"}]
    # context['hello'] = 'Hello World!'
    # 使用 render 来替代之前使用的 HttpResponse
    # 这里render参数:request请求对象;template_name使用的模板;context:添加到模板的上下文词典
    return render(request, 'hello.html', {"ch":content})

我们可以把这个content看作是从数据库获取到的一系列数据
hello.html这样写:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table border="1">
        <th>username</th>
        <th>password</th>
        {% for item in ch%}
            <tr>
                <td>{{item.username}}</td>
                <td>{{item.password}}</td>
            </tr>
        {%endfor%}
    </table>
</body>
</html>

urls.py里:

from django.conf.urls import url
from HelloWorld.view import hello
urlpatterns = [
    # 输入的url以hello/开头的将去匹配hello这个请求
    # 例如,当输入为hello/开头时都会去执行view.py里的hello方法
    url("^hello/",hello),
]

起服务:在这个项目文件夹里python manage.py runserver
在浏览器中输入http://127.0.0.1:8000/hello/ 即可看到:


接下来,如果我们想有一个表单提交输入的数据,插入到表格中,可以这么写:
hello.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test post data</title>
</head>
<body>
    <form action="/hello/" method="post">
            {% csrf_token %}
            <P>
                <label >用户名:</label>
                <input type="text" name ='username'/>
            </P>
            <P>
                <label>密码:</label>
                <input type="text" name='password'/>
            </P>
            <p><input type="submit" value="提交"/></p>
        </form>
    <!--<h1>{{result.username}}</h1>-->

    <table border="1">
        {%for line in ch%}
       <tr>
           <td>{{line.username}}</td>
            <td>{{line.password}}</td>
       </tr>
        {%endfor%}
    </table>
</body>

view.py

def check(request):
    name=request.POST.get("username",None)
    pwd = request.POST.get("password",None)

    content = [{"username": "yumi", "password": "hahahah"}, {"username": "arashi", "password": "5*20"}]
    content.append({"username":name,"password":pwd})


    return render(request, 'hello.html', {"ch":content})
  1. url和path
from django.urls import path
path(route,view,kwargs=None,name=None)

route:路径
view:view中的哪个方法
name:好像是用来跳转新网址用的?

新建应用:​python manage.py startapp polls​
外层的settings.py中INSTALLED_APPS里添加"polls",新建的 app 如果不加到 INSTALL_APPS 中的话, django 就不能自动找到app中的模板文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件)

假设在urls.py中,我们需要更改路由,从add/3/4的形式变成了add/3and4,那么我们的网页中超链接依然有很多相对路径是add/3/4,需要做大量的更高。如果我们这么写~

超链接中使用name命名的那个方法,由于这个方法需要传入变量,所以在超链接也是传入变量的:
<a href="{%url 'add2' 4 5%}">计算 4+5</a>
一定要记得add2是加了括号的!这里url接收的第一个参数是name。

接下来,在urls.py的路由里添加一个相当于重定向:

path('add/<int:a>/<int:b>/', polls_view.add2, name='add2'),#之前的url映射到add2方法了
path('add/<int:a>and<int:b>/', polls_view.new_add),#新的url映射到新方法

在view.py里利用reverse把之前的方法映射到新的路由上:

def new_add(request,a,b):
    return HttpResponseRedirect(reverse("add2",args=(a,b)))

关于路由更改详情查看这篇文章:
https://www.cnblogs.com/s-1314-521/p/9752814.html

虽然HttpResponses可以返回HTML页面,但是当我们需要对模板进行填充的时候它就不行了,render函数的功能是载入模板,填充数据,然后生成HttpResponse对象,然后返回这个对象。

  1. django中模板文件的加载方式

在最外层的settings文件中,我们配置了这样一个路径:

INSTALLED_APPS = [
    ...
    # 添加APP
    'app1',
    'app2',
]
...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 修改 DIRS
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
] 

可以看到DIRS,就表示Django从哪里搜索模板文件。假设整体的project目录是这样的:

├── app1
│ │ urls.py
│ │ views.py
│ │ ...
│ └── templates
│ └── app1
│ └── home.html

├── app2
│ │ urls.py
│ │ views.py
│ │ ...
│ └── templates
│ └── app2
│ └── home.html

│── django_test
│ │ settings.py
│ │ urls.py
│ └── ...

└── templates
└── home.html

那么在加载模板的过程中,是会加载在最外层的那个templates/home.html,如果没有,再按照settings.py中INSTALLED_APPS的顺序依次加载每个应用目录下的templates/home.html。那么如果我们想让它加载app1应用目录下的home.html呢?

有两种方法(按以下两种方法的层册结构):
方式一、/project_name/app_name/templates/app_name/template_file_name.html
方式二、/project_name//templates/app_name/template_file_name.html
不论哪种方式,在视图函数中view.py引用模板都只要 "app_name/template_file_name.html" 就可以了

Reference:
django模板加载顺序与模板存放结构位置
django中的templates

django2.0.3如何解决多个templates冲突

7.模板继承

如果一个网站,点击某个按钮只有部分页面的主体变了,整体的排版布局什么的没有特别大的变化,是可以写个父模板,然后让子模板继承父模板来实现的。

父模板这样写:

{% block title %} {% endblock title %}

⚠️注意:

如果在模版中使用extends标签,它必须是模版中的第一个标签

不能在一个模版中定义多个相同名字的block标签

子模版不必定义全部父模版中的blocks,如果子模版没有定义block,则使用了父模版中的默认值

子模板这样写,使用的时候直接在继承的标签内部写就行

{% extends "basepage.html" %}
{% block title %}欢迎光临首页{% endblock %}

2019/11/22发现一个问题,即继承了父模板的子模板在使用include调用其他文件时,没有放在block标签里时显示不出来,其实不止是include显示不出来,如果你在没有重写的情况下在子模板里写啥都显示不出来。看到这么一句话:

重写的覆盖规则
- 不重写,将按照父模板的效果显示
- 重写,则按照重写效果显示`

子模板中block包含的东西为覆盖掉父模板中同名block所包含的东西

8.一些备忘录

  • 如果view文件中传的是一个字典类型的数据,在模板中取字典时使用dict.key来取,而不是python中的dict[key]

  • render()

from django.shortcuts import render
render(*request*, *template_name*, *context=**None*, *content_type=**None*, *status=**None*, *using=**None*)  

request,固定参数。
通俗的讲就是把context的内容, 加载进templates中定义的文件, 并通过浏览器渲染呈现.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 笔记来源:自强学堂-Django教程这个教程真的非常好用!强烈推荐 Django简介-组成部分 urls.py:网...
    LeeLom阅读 1,503评论 0 2
  • 23 模板 在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样...
    大鹏_c5f9阅读 409评论 0 0
  • 建立第一个项目 新建工程 进入你要建立工程的目录,键入如下命令(其中mysite是你的项目名称): django-...
    小小白老鼠阅读 712评论 0 1
  • 去年的事情特别多,也没有什么时间充电学习。今年目测轻松一点,年初本来计划就好好休息一下,结果一晃2017就度过了一...
    灰豹儿阅读 622评论 0 2
  • 来源: 实验楼链接: https://www.shiyanlou.com/courses/1127 实验楼学习实验...
    锦绣拾年阅读 274评论 0 0