Django配置

1、模版的使用

模版配置

在settings.py文件下配置模版所在目录

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 模版存放位置, 在根目录下,templates当中  e:\mycode\h2101A\day02
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

使用Django返回模版页面

1. 在templates目录下创建页面index.html, 写入以下内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 style="color: red;text-align: center">Hello Django!!</h1>
</body>
</html>

2. 在子应用app下的views.py中写逻辑返回页面

from django.shortcuts import render

from django.http import HttpResponse


def index(request):
    # 这里不写请求方法,默认是get
    # return HttpResponse('')
    return render(request, 'index.html')

3. 书写django中的路由

app01/urls.py下写入

from django.urls import path
from . import views
urlpatterns = [
    path('', views.index)
]

模板变量渲染

如果用户登录以后,用户的登录名称在网页中如何存储?要写死在网页中吗?那样的话,是不是django就没有起作用。我们应该如何去实现动态调整用户的名称。

于是乎,现在我们可以使用模版变量来解决这个问题,页面处数据变化的位置,我们不再写死,而是通过一种特殊的语法,叫做模版变量的形式来展示用户信息这部分数据,这个语法类似这样

{{ var }}

来简单修改一些刚才的index.html页面

{#<h1 style="color: red;text-align: center">{{ stu_list }}</h1>#}

而视图部分,此时可以通过在视图函数内部定义相关的模版变量,来让它通过视图函数去返回 在页面中,模版变量叫做username,那么在视图函数代码中,就需要有一个映射格式数据,他的key值对应*html页面中的模版变量,而value将是这个模版变量渲染的结果

 

方便一些的写法还可以直接用locals方法,将当前函数作用域下的变量及值组合为字典

 

如果成功的话,大家可以看到页面上可以通过视图所定义的变量进行渲染,返回 这样开发者们,也就将不再需要修改html页面,只需要在视图中,通过操作数据库等方式将数据处理好返回即可

同时,因为html页面中更加强大,支持了模版变量这样的内容,所以我们也不在将django中所编写html称作html页面,而是叫做模版页面

那么render方法,我们也可以来做一下总结,render可以用来返回一个模板页面,并将一个字典组合成的模板变量传递到模板页面上,完成页面的渲染

 

2、模版语句循环、分支

for 标签

使用模板中使用标签语言{% for %}{% endfor%},对视图函数传递的数据集进行遍历访问,比如上面传递的字符串,列表,元祖,字典,集合这样的数据

和普通模板变量不同,模板标签使用大括号百分号的组合{% lag %},具有有一些特殊的功能性

模板中的标签{% for %}与Python中的for循环类似,要记得有闭合模板标签{{ endfor }}

{#   for i in items #}

{#    endfor #}

1、在views.py中写一个函数视图

from django.shortcuts import render


def index(request):
    # 这里不写请求方法,默认是get
    # return HttpResponse('')

    context = {'stu_list': [{'id': '1', 'name': '刘备'}, {'id': '2', 'name': '关羽'}]}
    return render(request, 'index.html', context=context)

2、在页面当中接收context传递的内容

{% for i in items %}
	这里写入循环内容
{% endfor %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table>
    <tr>
        <td>编号</td>
        <td>名称</td>
        <td>操作</td>
    </tr>
    {% for stu in stu_list %}
        <tr>
            <td>{{stu.id}}</td>
            <td>{{stu.name}}</td>
            <td>
                <button>删除</button>
            </td>
        </tr>
    {% endfor %}

</table>
</body>
</html>

取循环当中的索引等内容

{{forloop.counter}}  # 取循环当中索引,从1开始
{{forloop.counter0}}  # 取循环当中索引,从0开始
{{forloop.first}}  # 取第一个
{{forloop.last}}  # 取最后一个
{{forloop.revcounter}}  # 取循环当中索引,从后往前取
{{forloop.revcounter0}}  # 取循环当中索引,从后往前取到0
{{forloop.parentloop}}  # 取循环当中父级

if语法

{% if %}
{% elif %}
{% else %}

{% endif %}
// 在html 当中使用if
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{# {{  }}  渲染context传递 的内容,获取key,可以拿到对应的值 #}
{#<h1 style="color: red;text-align: center">{{ stu_list }}</h1>#}
<table>
    <tr>
        <td>索引</td>
        <td>编号</td>
        <td>名称</td>
        <td>年龄</td>
        <td>操作</td>
    </tr>
{#   for i in items #}

{#    endfor #}
    {% for stu in stu_list %}
        <tr>
            <td>{{ forloop.revcounter }}</td>
            <td>{{stu.id}}</td>
            <td>{{stu.name}}</td>
            {% if stu.age >= 30 %}
                <td style="color: red">{{stu.age}}</td>

                {% else  %}
                <td style="color: blue">{{stu.age}}</td>
            {% endif %}

            <td>
                <button>删除</button>
            </td>
        </tr>
    {% endfor %}


</table>
</body>
</html>

布尔值判断、 逻辑判断都可以做的

静态资源模版使用

在项目根目录下新建static文件夹

# settings.py 配置
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

在页面当中引入静态资源

{% load static %}

在head标签当中写入 {% load static %}

在页面当中引入静态资源

# 在index.html当中的head标签里面
<head>
	{% load static %}
    <link href="{% static 'index.css' %}">
</head>

3、ORM映射

注册登录

ORM映射概念

对象关系映射, django和数据库之间的关系映射

在models.py中写一个类,这个类就对应数据库的一张表

里面的属性,就是表中的字段

数据库字段属性类型

字符串 CharField

整型 IntegerField

图片 ImageField

邮箱 EmailField

模型类编写

# app01/models.py
from django.db import models

# Create your models here.


class User(models.Model):
    username = models.CharField(max_length=32, verbose_name='用户名')  # verbose_name 这个会在一会儿的admin当中用到
    password = models.CharField(max_length=128, verbose_name='密码')
    
    def __str__(self):
        return self.username

生成迁移文件

python manage.py makemigrations

执行迁移

python manage.py migrate

4、使用admin对数据进行增删改查

1. 在app01下的admin.py中导入用户模型

from .models import User

2. 在admin.py中注册用户模型

admin.site.register(User)

3. 创建超级用户

python manage.py createsuperuser

4. 改变语言,让admin页面变成中文

# setting.py中配置
LANGUAGE_CODE = 'zh-hans'  # 语言

TIME_ZONE = 'Asia/Shanghai'  # 时区

USE_TZ = False  # 让修改的时区生效

5. 让admin页面当中的模型变成中文

class User(models.Model):
    username = models.CharField(max_length=32, verbose_name='用户名')  # verbose_name 这个会在一会儿的admin当中用到
    password = models.CharField(max_length=128, verbose_name='密码')

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = '用户'
        verbose_name_plural = verbose_name

使用django来完成登录功能

1. 在templates下新建一个login.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .div01 {
            width: 50%;
            margin: 50px auto;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="div01">
        <h2>登录页面</h2>
        <form action="" method="post">
            <p>username: <input type="text"></p>
            <p>password: <input type="text"></p>
            <p><input type="submit" value="登录"></p>
        </form>
    </div>
</body>
</html>

2.使用django把login渲染到网页中

def login(request):
    # 判断请求方法,如果请求方法为get,返回login页面
    if request.method == 'GET':
        return render(request, 'login.html')

3. 请求方法为post时,先打印一下请求到数据,看看数据格式

def login(request):
    # 判断请求方法,如果请求方法为get,返回login页面
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':
        print(request.POST)
        return render(request, 'login.html')

4. html为input添加name属性,获取输入的内容

<body>
    <div class="div01">
        <h2>登录页面</h2>
        {{ msg }}
        <form action="" method="post">
            {% csrf_token %}
            <p>username: <input type="text" name="username"></p>
            <p>password: <input type="text" name="password"></p>
            <p><input type="submit" value="登录"></p>
        </form>
    </div>
</body>

5. 在登录视图当,完成登录逻辑

def login(request):
    # 判断请求方法,如果请求方法为get,返回login页面
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':
        """
        <QueryDict: {'csrfmiddlewaretoken': ['u2YPTWhJE2bGhbrfOYrA0Nl4PiiJn7HdOlsmx31z74oOS0GTPbJC3DDdCHfxViR1'], 
        'username': ['董海明'], 'password': ['123']}>
        """
        print(request.POST)
        # 获取网页请求数据
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 判断用户是否是注册用户
        # 通过用户名获取用户对象,用来判断用户是否是注册用户
        # filter() 过滤符合条件的数据
        # first() 获取第一条数据
        user_obj = User.objects.filter(username=username).first()
        print(user_obj)  # <QuerySet [<User: 董海明>]>
        # 判断,如果用户存在,并且密码正确,跳转页面
        if user_obj and user_obj.password == password:
            return render(request, 'index.html', {'msg': '登录成功'})
        # 否则提示用户名和密码不正确
        else:
            return render(request, 'login.html', {'msg': '用户名和密码不正确'})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值