中间准备——视图和模板基础

一、创建django项目

file------new project

二、视图和路由

1.定义视图

复制代码
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request): #视图函数默认接收一个 request作为参数,包含了所有请求的信息。
    return HttpResponse('hello world')

2.URL****配置

语法:
1、定义,指定正则和视图的对应关系
url( 正则 ,' 视图名称 ')

复制代码
from django.conf.urls import include, url
from django.contrib import admin
from myapp.views import index

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^index/', index,name='index'),
    url(r'^$', index,name='index'),
]

访问http://127.0.0.1:8000/


http://127.0.0.1:8000/index

访问 http://127.0.0.1:8000/1
报错

2、包含,一般在自定义应用中创建一个 urls.py 来定义 url
url( 正则 ,include(' 应用 .urls'))
再创建一个app------myapp2
在settings.py中注册路由

在myapp2/views.py中

复制代码
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

def index2(request):
    return HttpResponse("ok")

在myapp和myapp2下各创建一个urls.py

myapp/urls.py

复制代码
from django.conf.urls import url
from .views import *

urlpatterns = [
    url(r'^index/', index, name='index'),
    url(r'^$', index),  # 去一个地方,可以有两条路线(路由)

]

myapp2/urls.py

复制代码
from django.conf.urls import url
from .views import *

urlpatterns = [
    url(r'^index/', index2, name='index2'),
    url(r'^$', index2),
]

主路由work/urls.py

复制代码
from django.conf.urls import include, url
from django.contrib import admin
from myapp.views import index

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^myapp2/', include('myapp2.urls')),  # http://127.0.0.1:8000/myqpp2
    url(r'', include('myapp.urls')),  # 符合正则将会进入myapp的urls.py中继续匹配。
    # url(r'^index/', index,name='index'),
    # url(r'^$', index,name='index'),
]

访问 127.0.0.1:8000127.0.0.1:8000/index/


访问 127.0.0.1:8000/myapp2/127.0.0.1:8000/myapp2/index/


正则说明:

1 、正则部分推荐使用 r ,表示字符串不转义,这样在正则表达式中使用 \ 只写一个就可以
2 、不能在开始加反斜杠,推荐在结束加反斜杠
错误使用:正则开头加 /
r'/index'
r'/index/'

3.视图与模型交互1

在templates下面创建myapp和myapp2两个文件夹

然后myapp下创建一个index.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>

<h1 style="background-color: greenyellow">欢迎来到我的世界</h1>
<hr>
<a href="http://127.0.0.1:8000/myapp2">进入myapp2</a> <br>
<a href="/myapp2">进入myapp2</a> <br> {# 用这个写法,上面不建议使用 #}
<a href="{% url 'index2' %}">进入myapp2</a> <br> {# 路由别名的用法 #}
<a href="{% url 'index' %}">回到主页</a> <br> {# 路由别名的用法 #}

</body>
</html>

在myapp/views.py

复制代码
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request): #视图函数默认接收一个 request作为参数,包含了所有请求的信息。
    # return HttpResponse('hello world')
    return render(request, 'myapp/index.html')

刷新浏览器

点击链接

4.视图与模型交互2

在myapp/models.py中

复制代码
from django.db import models

# Create your models here.


class Post(models.Model):
    title = models.CharField(max_length=20)
    content = models.TextField("内容")  # 文章标内容
    author= models.CharField(max_length=20)

执行迁移命令

连接数据库

输入一些数据

在myapp/views.py

复制代码
from django.shortcuts import render
from django.http import HttpResponse
from .models import Post  # 导入模型类

# Create your views here.
def index(request): #视图函数默认接收一个 request作为参数,包含了所有请求的信息。
    # return HttpResponse('hello world')
    # return render(request, 'myapp/index.html')
    p = Post.objects.first()
    plist = Post.objects.all()
    # render函数分成了三步
    # #1.加载模板
    # template = loader.get_template('myapp/index.html')
    # #2.添加上下文
    # context = RequestContext(request,{"p":p,'p_all':plist})
    # #3.渲染模板
    # return HttpResponse(template.render(context))

    return render(request, 'myapp/index.html', context={"p": p, 'p_all': plist})

在templates/index.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>
标题:<h1>{{ p.title }}</h1>
内容: <p>{{ p.content }}</p>
<hr>
{% for post in p_all %}
    标题:<h1>{{ post.title }}</h1>
    内容: <p>{{ post.content }}</p>
{% endfor %}


<h1 style="background-color: greenyellow">欢迎来到我的世界</h1>
<hr>
<a href="http://127.0.0.1:8000/myapp2">进入myapp2</a> <br>
<a href="/myapp2">进入myapp2</a> <br> {# 用这个写法,上面不建议使用 #}
<a href="{% url 'index2' %}">进入myapp2</a> <br> {# 路由别名的用法 #}
<a href="{% url 'index' %}">回到主页</a> <br> {# 路由别名的用法 #}

</body>
</html>

刷新浏览器

5.url****中参数提取

myapp/views.py创建一个detail函数

复制代码
def detail(request, y, m, c):
    return HttpResponse(f"<h1>{y}年/{m}月/{c}日</h1>")

myapp/urls.py注册路由

复制代码
url(r'^detail/(\d+)/(\d+)/(\d+)', detail), #动态路由  \d+表示1个或者多个数字 ()表示提取

项目重启后输入127.0.0.1:8000/detail/2001/1/1得到

输入127.0.0.1:8000/detail/2024/12/12 ,得到

6.视图与模型交互3

将原来的detail函数注释掉

并在templates/myapp下再创建一个detail.html

然后myapp/views.py中

复制代码
def detail(request,post_id):
    p = Post.objects.get(id=post_id)
    return render(request, 'myapp/detail.html', context={"p": p})

detail.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>详情页</title>
</head>
<body>
<a href="/">回到主页</a>

<h1>{{ p.title }}</h1>
<hr>
<p>{{ p.content }}</p>
<hr>
<p>{{ p.author }}</p>

</body>
</html>

myapp/urls.py添加路由

复制代码
url(r'^detail/(\d+)', detail), #动态路由  \d+表示1个或者多个数字 ()表示提取

myapp/index.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>
{#标题:<h1>{{ p.title }}</h1>#}
{#内容: <p>{{ p.content }}</p>#}
{#<hr>#}
{#{% for post in p_all %}#}
{#    标题:<h1>{{ post.title }}</h1>#}
{#    内容: <p>{{ post.content }}</p>#}
{#{% endfor %}#}
{% for post in p_all %}
    标题:<a href="/detail/{{ post.id }}">{{ post.title }}</a> <br>
{% endfor %}

<h1 style="background-color: greenyellow">欢迎来到我的世界</h1>
<hr>
<a href="http://127.0.0.1:8000/myapp2">进入myapp2</a> <br>
<a href="/myapp2">进入myapp2</a> <br> {# 用这个写法,上面不建议使用 #}
<a href="{% url 'index2' %}">进入myapp2</a> <br> {# 路由别名的用法 #}
<a href="{% url 'index' %}">回到主页</a> <br> {# 路由别名的用法 #}

</body>
</html>

项目重启后访问http://127.0.0.1:8000/

点击第一个标题

点击第三个标题

相关推荐
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU5 小时前
三大范式和E-R图
数据库