• Django 开发模板与视图


    Django最强大的部分之一是自动管理界面。它从模型中读取元数据,以提供一个快速的,以模型为中心的界面,受信任的用户可以在其中管理您网站上的内容。管理员的建议用法仅限于组织的内部管理工具。它并非旨在构建您的整个前端。

    初始化Django

    pip install django                                  # 安装
    django-admin startproject MyProject                 # 创建项目
    D:MyProject> django-admin startapp MyWeb            # 创建APP
    D:MyProject> python manage.py runserver 0.0.0.0:80  # 启动Django
    
    D:MyProject> python manage.py shell   # 进入Django交互shell
    D:MyProject> python manage.py dbshell # 进入DBShell
    D:MyProject> python manage.py check   # 检查Django完整性
    

    修改一下django的配置文件settings.py,导入我们生成APP的名字.

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',                # 注释掉此行
        'django.contrib.auth.middleware.AuthenticationMiddleware',
    ]
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'MyWeb.apps.MywebConfig'           # 添加此行,导入我们的APP的名字
    ]
    

    然会修改urls.py在这里写一条路由记录.

    from MyWeb import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path("hello/",views.hello,name="hello")
    ]
    

    最后我们在views.py视图函数里添加一条路由.

    from django.shortcuts import HttpResponse
    
    def hello(request):
        return HttpResponse("<h1>hello lyshark</h1>")
    

    有时候我们需要在本地引入JS或者静态资源,此时你需要修改一下Django的setting.py里面的路径.

    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/3.0/howto/static-files/
    # 此时我们的默认路径是/static/,那么前端就可以直接调用<script src="/static/lyshark.js">
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR,'static')
    )
    

    邮件发送

    # name:settings.py
    STATIC_URL = '/static/'
    EMAIL_USER_TLS = True
    EMAIL_PORT = 25
    EMAIL_HOST = "smtp.163.com"
    EMAIL_HOST_USER = "smtpwho@163.com"
    EMAIL_HOST_PASSWORD = "授权密码"
    
    # name: views.py
    from django.shortcuts import render,HttpResponse
    from django.core.mail import send_mail, send_mass_mail, EmailMultiAlternatives
    
    def send(request):
        if request.method == "GET":
            return HttpResponse("""
            <form action="/send/" method="POST">
                <input type="submit" value="发送邮件">
            </form>
            """)
        else:
            ret = send_mail("Django 邮件通知",                # 邮件名称
                            "这是一封来自Django的邮件",        # 邮件内容
                            "smtpwho@163.com",               # 发信邮箱
                            ['admin@blib.cn'])               # 收信邮箱
            if ret:
                return HttpResponse("完成")
            else:
                return HttpResponse("失败")
    

    使用类视图映射

    # name:urls.py
    from MyWeb import views
    urlpatterns = [
        path('index/',views.index.as_view())
    ]
    
    # name:views.py
    from django import views
    class index(views.View):
        def get(self,request,*args,**kwargs):
            pass
    
        def post(self,request,*args,**kwargs):
            pass
    

    简单的路由编写

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('',views.index,name="index"),                                     # 一条访问主站的路由
        path('login/id=<int:id>&name=<str:name>',views.login,name="login"),    # 名称后面传递参数
        path('add/<int:x>/<int:y>/',views.add,name="add")                      # 路径中传递参数
    ]
    
    from django.shortcuts import render,HttpResponse
    def index(request):
        return render(request,"index.html")
    
    def login(request, id, name):
        return HttpResponse("用户ID{} , 用户名{} ".format(id,name))
    
    def add(request,x,y):
        temp = int(x)+int(y)
        return HttpResponse("相加结果:{}".format(temp))
    

    使用模板传递简单的参数

    <b>用户名: {{ user }} 密码:{{ pasd }} 标题:{{ title }}</b>
    
    def index(request):
        username = "lyshark"
        password = "123123"
        title = "hello lyshark"
        return render(request,"index.html",{"user":username,"pasd":password,"title":title})
    

    后端组装数据然后传递给前端

    <b>用户名: {{ user }} 密码:{{ pasd }} 标题:{{ title }}</b>
    
    def index(request):
        username = "admin"
        password = "123123"
        title = "hello lyshark"
    
        dict = {
            "user": username,
            "pasd": password,
            "title": title
        }
        return render(request,"index.html",dict)
    

    通过info变量遍历出指定字段元素

    <b>站点名称:{{ info.site }} 站点描述:{{ info.content }}</b>
    
    def index(request):
        info = {"site":"blib.cn","content":"hello lyshark"}
        return render(request,"index.html",{"info":info})
    

    通过for语句遍历打印列表数据

        {% for item in total %}
            <b>打印数据: {{ item }}</b><br>
        {% endfor %}
    
    def index(request):
        lists = ["HTML","CSS","JAVASCRIPT","Python","JQuery"]
        return render(request,"index.html",{"total":lists})
    

    通过for语句倒序循环打印

        {% for item in total reversed%}
            <b>打印数据: {{ item }}</b><br>
        {% endfor %}
    
    def index(request):
        lists = ["1","2","3","4","5"]
        return render(request,"index.html",{"total":lists})
    

    通过使用for循环遍历字典

    {% for key,value in info.items %}
        {{ key }} : {{ value }}
    {% endfor %}
    
    def index(request):
        info = {"site":"blib.cn","content":"hello lyshark"}
        info1 = {"site": "blib.cn", "content": "hello admin"}
    
        return render(request,"index.html",{"info":info,"info1":info1})
    

    Django 实现选择框选择

    <form action="/index/" method="post">
        选择A:
        <select name="tag_select_a">
            {% for item in total_a %}
                <option value = "{{ item }}"> {{ item }} </option>
            {% endfor %}
        </select>
        选择B:
        <select name="tag_select_b">
            {% for item in total_b %}
                <option value = "{{ item }}"> {{ item }} </option>
            {% endfor %}
        </select>
        <input type="submit" value="提交选择">
    </form>
    
    
    def index(request):
        if request.method == "GET":
            tag_select_a = ["HTML", "CSS", "JAVASCRIPT", "Python", "JQuery"]
            tag_select_b = ["MySQL","Oracle","MSSQL"]
            return render(request, "index.html", {"total_a": tag_select_a,"total_b": tag_select_b})
        elif request.method == "POST":
            select_a = request.POST.get("tag_select_a")
            select_b = request.POST.get("tag_select_b")
            return HttpResponse("选择A: {} 选择B: {}".format(select_a,select_b))
    

    简单的路径拼接

    <a href="{{ request.path }}?uid=1">当前网址加参数</a>
    
    <!--获取当前路径      拼接成 /add/4/5-->
    {{ request.path }}{% url 'add' 4 5 %}
    
    def add(request,x,y):
        temp = int(x)+int(y)
        return HttpResponse("相加结果:{}".format(temp))
    
    def index(request):
        return render(request,"index.html")
    

    判断用户是否登录

    {% if request.user.is_authenticated %}
        {{ request.user.username }},您好!
    {% else %}
        请登陆,这里放登陆链接
    {% endif %}
    

    使用if语句判断数据

    {% if username == "lyshark" and password == "123123" %}
        <b>恭喜你</b>
    {% elif username == "admin" or password == "123123" %}
        <b>欢迎管理员</b>
    {% else %}
        <b>这个都不是</b>
    {% endif %}
    
    def index(request):
        username = "admin"
        password = "123123"
        return render(request,"index.html",{"username":username,"password":password})
    

    if语句也可以判断列表元素

    {% if 1 in list %}
        <b>在里面</b>
    {% elif 10 not in list %}
        <b> 不在里面</b>
    {% endif %}
    
    def index(request):
        list = [1,2,3,4,5]
        return render(request,"index.html",{"list":list})
    

    最后的大总结:if与for语句的结合

    {% for item in info %}
        {% if forloop.first %}
            <b>开始了</b>
        {% endif %}
        {{ forloop.counter }} : {{ item }}<br>
        {% if forloop.last %}
            <b>最后了</b>
        {% endif %}
    {% endfor %}
    
    def index(request):
        list = map(str,range(100))
        return render(request,"index.html",{"info":list})
    
    forloop.counter 索引从 1 开始算
    forloop.counter0    索引从 0 开始算
    forloop.revcounter  索引从最大长度到 1
    forloop.revcounter0 索引从最大长度到 0
    forloop.first   当遍历的元素为第一项时为真
    forloop.last    当遍历的元素为最后一项时为真
    forloop.parentloop  
    用在嵌套的 for 循环中,获取上一层 for 循环的 forloop
    

    常用的过滤器: 常用的过滤器,有以下几种.

        <b> 列表长度: {{ total | length }}</b><br>
        <b> 输出大小: {{ size | filesizeformat }}</b><br>
        <b> 输出时间: {{ date | date:"Y-m-d" }}</b><br>
        <b> 首字母大写: {{ title | capfirst }}</b><br>
        <b> 从字符串中移除hello字符: {{title | cut:"hello" }}</b><br>
        <b> 显示字符串第一个元素: {{ total | first }}</b><br>
        <b> 显示字符串最后一个元素: {{ total | last }}</b><br>
        <b> 大小写转换(upper/lower): {{ title | upper }}</b><br>
        <b> 对数据切片: {{ title | slice:"2:-1" }}</b><br>
        <b>截断字符:{{ title | truncatechars:5 }}</b><br>
        <b>截断单词:{{ title | truncatewords:1 }}</b>
    
    def index(request):
        filesize = 10240
        title = "hello lyshark"
        date = datetime.datetime.now()
        lists = ["1","2","3","4","5"]
        return render(request,"index.html",{"total":lists,"size":filesize,"date":date,"title":title})
    

    自定义过滤器与标签

    1.首先在Django项目下的APP里面,创建一个templatetags的目录,这个目录名不能变.

    MyWeb/
        __init__.py
        models.py
        templatetags/
            __init__.py
            mysimple.py
        views.py
    

    2.在templatetags目录下创建任意的py文件,此处我们就创建一个mysimple.py,并写入以下两条内容.

    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library() # 此处必须这样写
    
    # simple_tag(自定义标签):不会限制传参,但不支持if
    @register.simple_tag
    def simple_time(var1,var2,var3):
        temp = int(var1)+int(var2)+int(var3)
        return temp
    
    # filter(自定义过滤器):限制传参2个,但支持if
    @register.filter
    def My_filter(value, arg):
        # 传递一个参数的过滤器
        return str.upper(value) + arg
    
    

    3.在我们需要使用自定义过滤器的时候,必须在index.html中引入这个变量,然后在前端就可以调用了.

    # name: views.py
    def index(request):
        title = "hello"
        return render(request,"index.html",{"title":title})
    
    # name: index.html
    <!--引入自定义的过滤器-->
    {% load mysimple %}
    
    <b>自定义标签返回数值: {% simple_time 10 20 30 %}</b>          <!-- 传递多个参数 -->
    <b>传递一个参数的过滤器: {{ title | My_filter:'lyshark' }}</b> <!-- 传递一个参数 -->
    

    模板与模板继承

    母板:             {% block title %}{% endblock %}
    子板继承:         {% extends "base.html" %}
    子板中使用其他模板: {% include "xx.html" %}
    设置标题:          {% block title %}{% endblock %}
    使用CSS资源:       {% block css %} {% endblock %}
    使用JS资源:        {% block js %} {% endblock %}
    

    1.首先创建一个base.html文件,以作为我们的母版.

    <html>
    <head>
        <meta charset="UTF-8">
        {% block css %}{% endblock %}
    </head>
        <body>
            <div class="pg-body">
                <div class="body-menu">
                    <ul>
                        <li><a href="/user">用户管理</a></li>
                        <li><a href="/hosts">资产管理</a></li>
                    </ul>
                </div>
                <div class="body-content">
                    {% block body %}{% endblock %}   <!--占位符,用于填充子版块-->
                </div>
            </div>
            {% block js %}{% endblock %}
        </body>
    </html>
    

    接着我们需要创建一个子板并继承母版,此处我们创建一个hosts.html这样的文件.

    {% extends 'base.html' %}
    {% block js %} {% endblock %}
    {% block css %} {% endblock %}
    
    {% block body %}
        <table>
            {% for item in host %}
                <tr>
                    <td>{{ item.hostname }}</td>
                    <td>{{ item.port }}</td>
                </tr>
            {% endfor %}
        </table>
    {% endblock %}
    

    我们继续创建一个user.html,同样也是继承base.html模板.

    {% extends 'base.html' %}
    
    {% block js %} {% endblock %}
    {% block css %} {% endblock %}
    
    {% block body %}
        <ul>
        {% for item in user_list %}
            <li>{{ item.username }},{{ item.salary }}</li>
        {% endfor %}
        </ul>
    {% endblock %}
    

    此处我们需要在urls.py里面写好路由分发.

    from django.contrib import admin
    from django.urls import path
    from MyWeb import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('',views.index,name="index"),
        path('hosts/',views.hosts,name="hosts"),
        path('user/',views.userinfo,name="user")
    ]
    

    然后写好views.py中的视图函数,默认我们返回base.html这个页面.

    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    
    def index(request):
        return render(request,"base.html")
    
    def hosts(request):
        hosts_list = []
        for i in range(10):
            temp = {'hostname':'192.168.1.'+str(i),'port':80}
            hosts_list.append(temp)
        return render(request,'hosts.html',{'host':hosts_list})
    
    def userinfo(request):
        user_list = []
        for i in range(10):
            temp = {'username': 'user' + str(i),'salary':80}
            user_list.append(temp)
        return render(request,'user.html',{'user_list':user_list})
    

    版权声明: 本博客,文章与代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!

    警告:如果您恶意转载本人文章,则您的整站文章,将会变为我的原创作品,请相互尊重!
  • 相关阅读:
    【InteillJ IDEA】Git的安装+同步项目到GitHub上
    【GitHub】给GitHub上的ReadMe.md文件中添加图片怎么做 、 gitHub创建文件夹
    【Linux】CentOS7上解压zip需要安装uzip
    【Linxu】CentOS7下安装程序报错:
    【linux】CentOS编译程序报错 修复 ./Modules/_ssl.c:64:25: 致命错误:openssl/rsa.h:没有那个文件或目录
    【redis】4.spring boot集成redis,实现数据缓存
    【报错】spring整合activeMQ,pom.xml文件缺架包,启动报错:Caused by: java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler
    【报错】项目启动部署时报错:java.lang.NoSuchMethodError
    【IntelliJ idea/My/ecplise】启动项目前,修改配置JVM参数
    Java 读写文件大全
  • 原文地址:https://www.cnblogs.com/LyShark/p/12195459.html
Copyright © 2020-2023  润新知